スイッチの「オン」の色を変更する


156

ICSアプリで、holo.lightテーマの標準のSwitchコントロールを使用しています。

トグルボタンのハイライト状態またはオン状態の色を標準の水色から緑に変更したい。

これは簡単なはずですが、どうすればいいのかわからないようです。


関連するプラットフォームリソース(セレクターファイルと* .pngファイル)をコピーして「オン」状態のドローアブルを変更する以外に方法はありません。Switch後でこのカスタムセレクタをポイントすることを忘れないでください。
MH。

回答:


100

現在のところ、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>

ref:Android開発者ブログ

編集

それが正しく適用される方法は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">

1
現時点では該当しませんが、これは受け入れられる答えです。
Andrew Gallasch 2015年

この質問に対するより「現代的な」アプローチのように見えるので、これを受け入れられた回答に変更しました。
JamesSugrue、2015年

1
私はこれらすべてを試しましたが、どれも私のスイッチの「オン」状態の色を変更しませんでした。
Adam Johns

31
「オン」はcolorAccent、「オフ」はcolorSwitchThumbNormalです。使用している場合はAppCompat、テーマを、あなたが使用する必要があるSwitchCompatのではなくSwitch。SDK 23以降を使用android:thumbTintandroid:thumbTintModeている場合は、およびを使用できますColorStateList
トム

1
@Tom plzの返信は、「android:thumbTint」のものが23未満のデバイスで機能します
Shirish Herwade

269

パーティーには遅れますが、これは私がやった方法です

スタイル

 <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" />

結果

有効化および無効化されたスイッチの色の変更を参照してください

ここに画像の説明を入力してください


14
@MaksimKniazevを使用する必要がありますSwitchCompat;)
Ovi Trif

1
colorControlActivatedを除いて良好です。トラックの色は設定されず、親指の色のみが設定されます。
Pointer Null

1
ここでは、スイッチとSwitchCompatためのソリューションです:stackoverflow.com/a/47036089/5869630
roghayehホセイニ

<style>タグをres >> values >> styles.xmlの下に、および<Switch ...>のXMLページに書き込む必要があります。android:theme = "@ style / SCBSwitchという行だけを追加してください。私の色は:colorControlActivated ">#ff0000とcolorSwitchThumbNormal">#00ff00とandroid:colorForeground ">#00ff00
ベイ

@OviTrifすごい!そのような簡単な情報を見つけるのがいかに難しいかが印象的です。私が読んでいるたくさんのたくさんの答え、そして今まで誰もがうまくいく答えを出していませんでした。最後に!
jairhumberto

49

これは私のために働いています(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);

Android 6〜7のアップデート

チェルビーがコメントで述べたように、私は新しいもの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);
}

私はgetThumbDrawable / getTrackDrawableアプローチを使用して、両方の状態が同じ色のスイッチを作成しています。つまり、スイッチは何かを有効または無効にしませんが、2つの選択肢の選択に使用されます。
Natix

4
DrawableCompat.setTintListを使用すると、以前のデバイスで機能するようになります。私は呼び出します:DrawableCompat.setTintList(switchCompat.getThumbDrawable()、foregroundState);
Alexey

回答を編集してDrawableCompatソリューションを含めてください。それは完全に動作します!
Dmytro Karataiev 16

API 23+: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#に変換します。
Cheruby

37

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の視覚的な結果です。

ここに画像の説明を入力してください


17
これにより、親指のオン/オフに関係なく、親指の色が変わります。
Android開発者

1
「属性thumbTintはAPIレベル21以上でのみ使用されます」
norbDEV

6
@norbDEVは、AppCompat.v7ライブラリのSwitchCompatでapp:thumbTintおよびapp:trackTintを使用して、APIレベルを下げます。
デビッドダリアス

それは機能しますが、それがオンかオフかに応じて、親指の色を変更したい場合はどうでしょうか?
TavernSenses

2
21未満のthumbTintを使用する場合は、app:thumbTint代わりに使用し、次のようにandroid:thumbTint変更switchしますSwitchCompat
Kavita_p

33

カスタムスイッチを作成し、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();
            }
        }
    }
}

2
実際に私を助けた最初の投稿は、スタイルやテーマを使用せずにマテリアルスイッチのカスタムカラーを実現しました。よろしくお願いします!
Mackovich

1
いいね。私はすでに独自のカスタマイズされたスイッチを持っているので、setCheckedメソッドをオーバーライドするだけで、すべての色が自動的に変更されました。スペインからの感謝。
Julio

22

SubChordによる回答は正しいですが、他のウィジェットにも影響を与えずに「オン」カラーを設定する方法の質問には実際には回答しません。これを行うにはThemeOverlay、styles.xmlでinを使用します。

<style name="ToggleSwitchTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">@color/green_bright</item>
</style>

そしてあなたのスイッチでそれを参照してください:

<android.support.v7.widget.SwitchCompat
  android:theme="@style/ToggleSwitchTheme" ... />

そうすることで、適用したいビューの色にのみ影響します。


何らかの理由で、「colorControlActivated」も同じ値に設定する必要がありましたが、POCでは「colorAccent」を使用するだけで十分でした。どうして?
Android開発者

22
<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>

thumbTintAndroid API 21以降にのみ適用されます。Android 21以下で色を変更したい場合はどうすればよいですか?
Giovanka Bisano


1
それは2020年です。Android21以下をまだ使用している人は、世界中のどこにいるのでしょうか。
ジーシャン

18

スイッチの状態が変更されたときにカラーフィルターを更新して解決しました...

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);
    }
}

13

少し遅れる可能性がありますが、スイッチボタンの場合、ボタンが多すぎると問題が解決しません。スイッチのxmlパラメータでドローアブルを変更する必要があります。

 android:thumb="your drawable here"

9

ドローアブル "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に追加します:

<Switch
        android:trackTint="@drawable/newtrack"
        android:thumbTint="@drawable/newthumb"
         />

1
これは機能します。しかし、AndroidStudioがため@drawableリソースを提案することができなくなることに留意すべきですtrackTintthumbTint。手動で書き込む必要があり、機能します。
Benjamin Basmaci

何らかの理由で、これが私のHuaweiで確実に機能する唯一の答えです。ありがとう!
einUsername

7

Android Lollipop以降では、テーマスタイルで定義します。

<style name="BaseAppTheme" parent="Material.Theme">
    ...
    <item name="android:colorControlActivated">@color/color_switch</item>
</style>

このソリューションの問題は、選択したテキスト編集の色も変更することです。
コードウィング2016年

@codewingもちろんそうです。これはグローバルスタイル設定で設定されているためです。目標を達成するには、ターゲットビューのビューIDを見つけてその属性を変更する必要があります。
エメン、2016年

OK、それは「オン」の位置です。「オフ」の位置のつまみの色を変更するのはどうですか?
TavernSenses

7

独自の9パッチイメージを作成し、トグルボタンの背景として設定します。

http://radleymarx.com/2011/simple-guide-to-9-patch/


2
ええ、それは可能でしょうが、確かにもっと簡単な方法がなければなりませんか?セレクターかな?
JamesSugrue

いいえ、簡単な方法はありません。画像の色を魔法のように変更することはできません:)
you786

いい視点ね。私はそれがより深く見えるまで、それがどのように機能するかを完全には理解しませんでした。
JamesSugrue

@デニゼン、よろしいですか?もしそうなら、答えを投稿してください。投票します。
you786 2013

@Denizenコメントを削除してください。Android Switchは常にgetBackground()に対してnullを返します。これを試すのに30分無駄になりました。
Shirish Herwade、2016

5

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)を呼び出しません。


そのためのコードを提供できますか?switchInput.setPadding(0、0、0、0)を試しましたが、何も変わりませんでした。
arlomedia 2015

1
XamarinでAppCompatライブラリを使用して5.xをターゲットとしてテストしましたが、これは宣伝どおりに機能しました。
Alex.Ritna

4

カスタムスタイルを行うときに、デフォルトとして色アクセントを使用するスイッチウィジェットのカスタムスタイルを作成できます。

<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>    


1

ここで正しい答えを見つけてみてください:TextViewの背景色のセレクター。つまり、XMLで色付きのShapeを作成し、それをセレクターで「チェック済み」の状態に割り当てる必要があります。


素晴らしい解決策ですが、色を動的に変更する方法を知っていますか?
inverted_index

セレクターをバックグラウンドリソースとして設定するだけです
Shamm

1

私はjavaからそれを行う方法を知りませんが、あなたのアプリに定義されたスタイルがある場合、あなたはあなたのスタイルにこの行を追加することができ、あなたが私にとって望ましい色を持っているでしょう#3F51B5

<color name="ascentColor">#3F51B5</color>

1

最も簡単な方法は、トラックの色合いを定義し、色合いモードを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>

0

既存の回答への追加として、次の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"/>

あなたはスタンダール使用している場合ことを覚えておいてくださいSwitchandroid、これらの属性の名前空間を、それがAPI 23に対してのみ機能します以降、これを使用SwitchCompatしてapp名前空間xmlns:app="http://schemas.android.com/apk/res-auto"。、汎用ソリューションとして。

結果:

ここに画像の説明を入力してください


0

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)

-1

Android Studio 3.6のソリューション:

yourSwitch.setTextColor(getResources().getColor(R.color.yourColor));

カラーXMLファイルで定義された値(yourColor)のaのテキスト色を変更します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.