답변:
현재로서는 AppCompat.v7 라이브러리에서 SwitchCompat를 사용하는 것이 좋습니다. 그런 다음 간단한 스타일을 사용하여 구성 요소의 색상을 변경할 수 있습니다.
values/themes.xml:
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/my_awesome_color</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/my_awesome_darker_color</item>
<!-- colorAccent is used as the default value for colorControlActivated,
which is used to tint widgets -->
<item name="colorAccent">@color/accent</item>
<!-- You can also set colorControlNormal, colorControlActivated
colorControlHighlight, and colorSwitchThumbNormal. -->
</style>
심판 : 안드로이드 개발자 블로그
편집 :
올바르게 적용하는 방법은 android:theme="@style/Theme.MyTheme"
다음과 같으며 EditTexts, RadioButtons, Switches, CheckBoxes 및 ProgressBars와 같은 부모 스타일에도 적용 할 수 있습니다.
<style name="My.Widget.ProgressBar" parent="Widget.AppCompat.ProgressBar">
<style name="My.Widget.Checkbox" parent="Widget.AppCompat.CompoundButton.CheckBox">
colorAccent
'off'는 colorSwitchThumbNormal
입니다. 사용하는 경우 AppCompat
테마를, 당신은 사용할 필요 SwitchCompat
보다는 Switch
. SDK 23+를 사용하는 경우, 당신은 사용할 수 android:thumbTint
와 android:thumbTintMode
A를 ColorStateList
.
파티에 늦었지만 이것이 내가 한 방법입니다.
스타일
<style name="SCBSwitch" parent="Theme.AppCompat.Light">
<!-- active thumb & track color (30% transparency) -->
<item name="colorControlActivated">#46bdbf</item>
<!-- inactive thumb color -->
<item name="colorSwitchThumbNormal">#f1f1f1
</item>
<!-- inactive track color (30% transparency) -->
<item name="android:colorForeground">#42221f1f
</item>
</style>
그림 물감
나열한 것
<android.support.v7.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:checked="false"
android:theme="@style/SCBSwitch" />
결과
활성화 및 비활성화 스위치의 색상 변경 참조
SwitchCompat
;) 를 사용해야합니다 .
이것은 나를 위해 일하고 있습니다 (Android 4.1 필요).
Switch switchInput = new Switch(this);
int colorOn = 0xFF323E46;
int colorOff = 0xFF666666;
int colorDisabled = 0xFF333333;
StateListDrawable thumbStates = new StateListDrawable();
thumbStates.addState(new int[]{android.R.attr.state_checked}, new ColorDrawable(colorOn));
thumbStates.addState(new int[]{-android.R.attr.state_enabled}, new ColorDrawable(colorDisabled));
thumbStates.addState(new int[]{}, new ColorDrawable(colorOff)); // this one has to come last
switchInput.setThumbDrawable(thumbStates);
여기에 표시된대로 "기본"상태를 마지막에 추가해야합니다.
내가 볼 수있는 유일한 문제는 이제 스위치의 "엄지 손가락"이 스위치의 배경 또는 "트랙"보다 크게 나타납니다. 나는 여전히 빈 트랙이있는 기본 트랙 이미지를 사용하고 있기 때문이라고 생각합니다. 그러나이 기술을 사용하여 트랙 이미지를 사용자 정의하려고 시도했을 때 스위치의 켜기 / 끄기 텍스트가 조금만 표시된 상태에서 스위치의 높이가 1 픽셀 인 것으로 나타났습니다. 그에 대한 해결책이 있어야하지만 아직 찾지 못했습니다 ...
Android 5 용 업데이트
Android 5에서 위 코드는 스위치가 완전히 사라지게합니다. 새로운 setButtonTintList 메소드 를 사용할 수 있지만 스위치에서는 무시되는 것 같습니다. 그러나 이것은 작동합니다.
ColorStateList buttonStates = new ColorStateList(
new int[][]{
new int[]{-android.R.attr.state_enabled},
new int[]{android.R.attr.state_checked},
new int[]{}
},
new int[]{
Color.BLUE,
Color.RED,
Color.GREEN
}
);
switchInput.getThumbDrawable().setTintList(buttonStates);
switchInput.getTrackDrawable().setTintList(buttonStates);
안드로이드 6-7 업데이트
Cheruby가 의견에서 언급했듯이 새로운 setThumbTintList
것을 사용할 수 있으며 예상대로 작동했습니다. 우리는 또한 사용할 수 setTrackTintList
있지만 색상을 블렌드로 적용하여 어두운 색상 테마에서 예상보다 어둡고 밝은 색상 테마에서 예상보다 밝고 때로는 보이지 않는 점이 있습니다. Android 7에서는 트랙 색조 모드 를 재정 의하여 변경 사항을 최소화 할 수 있었지만 Android 6에서는 그 결과를 얻을 수 없었습니다. 혼합을 보완하는 추가 색상을 정의해야 할 수도 있습니다. (Google에서 앱의 모양을 맞춤 설정하지 않기를 원한다고 생각하십니까?)
ColorStateList thumbStates = new ColorStateList(
new int[][]{
new int[]{-android.R.attr.state_enabled},
new int[]{android.R.attr.state_checked},
new int[]{}
},
new int[]{
Color.BLUE,
Color.RED,
Color.GREEN
}
);
switchInput.setThumbTintList(thumbStates);
if (Build.VERSION.SDK_INT >= 24) {
ColorStateList trackStates = new ColorStateList(
new int[][]{
new int[]{-android.R.attr.state_enabled},
new int[]{}
},
new int[]{
Color.GRAY,
Color.LTGRAY
}
);
switchInput.setTrackTintList(trackStates);
switchInput.setTrackTintMode(PorterDuff.Mode.OVERLAY);
}
switchInput.setThumbTintList(buttonStates);
Nougat에서도 작동합니다. API 21-22 : @Alexey가 제안한 DrawableCompat을 사용하십시오. 는 switchInput.setButtonTintList(buttonStates);
내 스위치의 상태를 색상하지 않았다, 나를 위해 작동하지 않았다. 21 미만의 API : switchInput.getThumbDrawable().setColorFilter(someColor, PorterDuff.Mode.SrcIn);
이들은 나를 위해 일했습니다. Xamarin과 함께 작업 했으므로 Xamarin.Forms를 사용하는 경우 Android 렌더러에서 C #으로 변환하십시오.
style.xml 또는 Java 코드를 사용하지 않고 스위치 스타일을 변경하려면 레이아웃 XML로 전환을 사용자 정의 할 수 있습니다.
<Switch
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:thumbTint="@color/blue"
android:trackTint="@color/white"
android:checked="true"
android:layout_height="wrap_content" />
색상을 사용자 정의 할 수 있게 하는 것은 android : thumbTint 및 android : trackTint 속성입니다 .
이것이이 XML의 시각적 결과입니다.
app:thumbTint
대신 사용 android:thumbTint
하고 다음 switch
으로 변경하십시오 .SwitchCompat
사용자 지정 스위치를 만들고 setChecked를 재정 의하여 색상을 변경합니다.
public class SwitchPlus extends Switch {
public SwitchPlus(Context context) {
super(context);
}
public SwitchPlus(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SwitchPlus(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setChecked(boolean checked) {
super.setChecked(checked);
changeColor(checked);
}
private void changeColor(boolean isChecked) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
int thumbColor;
int trackColor;
if(isChecked) {
thumbColor = Color.argb(255, 253, 153, 0);
trackColor = thumbColor;
} else {
thumbColor = Color.argb(255, 236, 236, 236);
trackColor = Color.argb(255, 0, 0, 0);
}
try {
getThumbDrawable().setColorFilter(thumbColor, PorterDuff.Mode.MULTIPLY);
getTrackDrawable().setColorFilter(trackColor, PorterDuff.Mode.MULTIPLY);
}
catch (NullPointerException e) {
e.printStackTrace();
}
}
}
}
SubChord의 대답은 정확하지만 실제로 다른 위젯에도 영향을 미치지 않고 "켜기"색상을 설정하는 방법에 대한 질문에는 대답하지 않습니다. 이렇게하려면 ThemeOverlay
styles.xml에서 다음을 사용하십시오 .
<style name="ToggleSwitchTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/green_bright</item>
</style>
스위치에서 참조하십시오.
<android.support.v7.widget.SwitchCompat
android:theme="@style/ToggleSwitchTheme" ... />
이렇게하면 적용하려는 뷰의 색상에만 영향을 미칩니다.
<androidx.appcompat.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:thumbTint="@color/white"
app:trackTint="@drawable/checker_track"/>
그리고 checker_track.xml 내부 :
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/lightish_blue" android:state_checked="true"/>
<item android:color="@color/hint" android:state_checked="false"/>
</selector>
thumbTint
Android API 21 이상에만 적용됩니다. Android 21 이하에서 색상을 변경하려면 어떻게합니까?
스위치 상태가 변경되었을 때 컬러 필터를 업데이트하여 해결했습니다 ...
public void bind(DetailItem item) {
switchColor(item.toggle);
listSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
switchColor(b);
}
});
}
private void switchColor(boolean checked) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
listSwitch.getThumbDrawable().setColorFilter(checked ? Color.BLACK : Color.WHITE, PorterDuff.Mode.MULTIPLY);
listSwitch.getTrackDrawable().setColorFilter(!checked ? Color.BLACK : Color.WHITE, PorterDuff.Mode.MULTIPLY);
}
}
드로어 블 "newthumb.xml"만들기
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/Green" android:state_checked="true"/>
<item android:color="@color/Red" android:state_checked="false"/>
</selector>
드로어 블을 "newtrack.xml"로 만듭니다.
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/black" android:state_checked="true"/>
<item android:color="@color/white" android:state_checked="false"/>
</selector>
스위치에 추가하십시오 :
<Switch
android:trackTint="@drawable/newtrack"
android:thumbTint="@drawable/newthumb"
/>
trackTint
또는에 @drawable 리소스를 제안 할 수 없습니다 thumbTint
. 수동으로 작성해야하며 작동합니다.
Android Lollipop 이상에서 테마 스타일로 정의하십시오.
<style name="BaseAppTheme" parent="Material.Theme">
...
<item name="android:colorControlActivated">@color/color_switch</item>
</style>
자신 만의 9 패치 이미지를 만들고 토글 버튼의 배경으로 설정하십시오.
arlomedia에서 제안한 솔루션이 저에게 효과적이었습니다. 여분의 공간 문제에 대해 스위치의 모든 패딩을 제거했습니다.
편집하다
요청 한대로 여기에 내가 가진 것이 있습니다.
레이아웃 파일에서 내 스위치는 선형 레이아웃 안에 있고 TextView 뒤에 있습니다.
<LinearLayout
android:id="@+id/myLinearLayout"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal|center"
android:gravity="right"
android:padding="10dp"
android:layout_marginTop="0dp"
android:background="@drawable/bkg_myLinearLayout"
android:layout_marginBottom="0dp">
<TextView
android:id="@+id/myTextForTheSwitch"
android:layout_height="wrap_content"
android:text="@string/TextForTheSwitch"
android:textSize="18sp"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal|center"
android:gravity="right"
android:layout_width="wrap_content"
android:paddingRight="20dp"
android:textColor="@color/text_white" />
<Switch
android:id="@+id/mySwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOn="@string/On"
android:textOff="@string/Off"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:layout_toRightOf="@id/myTextForTheSwitch"
android:layout_alignBaseline="@id/myTextForTheSwitch"
android:gravity="right" />
</LinearLayout>
Xamarin / Monodroid (최소 Android 4.1)로 작업 중이므로 내 코드는 다음과 같습니다.
Android.Graphics.Color colorOn = Android.Graphics.Color.Green;
Android.Graphics.Color colorOff = Android.Graphics.Color.Gray;
Android.Graphics.Color colorDisabled = Android.Graphics.Color.Green;
StateListDrawable drawable = new StateListDrawable();
drawable.AddState(new int[] { Android.Resource.Attribute.StateChecked }, new ColorDrawable(colorOn));
drawable.AddState(new int[] { -Android.Resource.Attribute.StateEnabled }, new ColorDrawable(colorDisabled));
drawable.AddState(new int[] { }, new ColorDrawable(colorOff));
swtch_EnableEdit.ThumbDrawable = drawable;
swtch_EnableEdit는 이전에 다음과 같이 정의되었습니다 (Xamarin).
Switch swtch_EnableEdit = view.FindViewById<Switch>(Resource.Id.mySwitch);
모든 패딩을 설정하지 않았으며 .setPadding (0, 0, 0, 0)을 호출하지 않습니다.
사용자 정의 스타일을 수행 할 때 색상 악센트를 기본값으로 사용하는 스위치 위젯에 대한 사용자 정의 스타일을 만들 수 있습니다.
<style name="switchStyle" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorPrimary</item> <!-- set your color -->
</style>
이 lib를 사용하여 스위치 버튼의 색상을 쉽게 변경할 수 있습니다.
https://github.com/kyleduo/SwitchButton
여기에서 정답을 찾으십시오 : TextView의 배경색 선택기 . 즉, 색상으로 XML에서 Shape를 만든 다음 선택기에서 "checked"상태로 지정해야합니다.
가장 쉬운 방법은 트랙 색조를 정의하고 색조 모드를 src_over로 설정하여 30 % 투명도를 제거하는 것입니다.
android:trackTint="@drawable/toggle_style"
android:trackTintMode="src_over"
toggle_style.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/informationDefault"
android:state_checked="true"
/>
<item android:color="@color/textDisabled" android:state_checked="false"/>
</selector>
기존 답변 외에도 res/color
폴더의 선택기를 사용하여 썸 및 트랙을 사용자 정의 할 수 있습니다 . 예를 들면 다음과 같습니다.
switch_track_selector
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/lightBlue"
android:state_checked="true" />
<item android:color="@color/grey"/>
</selector>
switch_thumb_selector
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/darkBlue"
android:state_checked="true" />
<item android:color="@color/white"/>
</selector>
다음 선택기를 사용하여 트랙 및 썸 색조를 사용자 정의하십시오.
<androidx.appcompat.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:trackTint="@color/switch_track_selector"
app:thumbTint="@color/switch_thumb_selector"/>
당신이 STANDART 사용하는 경우 있음을 명심 Switch
하고 android
사용하기 때문에, 이러한 속성에 대한 네임 스페이스를, 그것은 단지 API 23 작동 이후 SwitchCompat
에 app
네임 스페이스 xmlns:app="http://schemas.android.com/apk/res-auto"
보편적 인 솔루션으로.
결과:
xml에서 색상을 다음과 같이 변경할 수 있습니다.
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/notificationSwitch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="true"
app:thumbTint="@color/darkBlue"
app:trackTint="@color/colorGrey"/>
동적으로 다음과 같이 변경할 수 있습니다.
Switch.thumbDrawable.setColorFilter(ContextCompat.getColor(requireActivity(), R.color.darkBlue), PorterDuff.Mode.MULTIPLY)
Switch
나중에이 사용자 정의 선택기 를 가리켜 야합니다 .