ICS 앱에서 holo.light 테마와 함께 표준 스위치 컨트롤을 사용하고 있습니다.
토글 버튼의 강조 또는 켜짐 상태 색상을 표준 연한 파란색에서 녹색으로 변경하고 싶습니다.
이것은 쉬워야하지만 어떻게 해야할지 모르겠습니다.
답변
현재로서는 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">
답변
파티에 늦었지만 이것이 내가 한 방법입니다.
스타일
<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" />
결과
활성화 및 비활성화 스위치의 색상 변경 참조
답변
이것은 나를 위해 일하고 있습니다 (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);
}
답변
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의 시각적 결과입니다.
답변
사용자 지정 스위치를 만들고 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>