[android] 스위치의 “켜짐”색상 변경

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 : thumbTintandroid : 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의 대답은 정확하지만 실제로 다른 위젯에도 영향을 미치지 않고 “켜기”색상을 설정하는 방법에 대한 질문에는 대답하지 않습니다. 이렇게하려면 ThemeOverlaystyles.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>