ICSアプリで、holo.lightテーマの標準のSwitchコントロールを使用しています。
トグルボタンのハイライト状態またはオン状態の色を標準の水色から緑に変更したい。
これは簡単なはずですが、どうすればいいのかわからないようです。
ICSアプリで、holo.lightテーマの標準のSwitchコントロールを使用しています。
トグルボタンのハイライト状態またはオン状態の色を標準の水色から緑に変更したい。
これは簡単なはずですが、どうすればいいのかわからないようです。
回答:
現在のところ、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">
colorAccent
、「オフ」はcolorSwitchThumbNormal
です。使用している場合はAppCompat
、テーマを、あなたが使用する必要があるSwitchCompat
のではなくSwitch
。SDK 23以降を使用android:thumbTint
しandroid:thumbTintMode
ている場合は、およびを使用できます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);
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);
}
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で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" ... />
そうすることで、適用したいビューの色にのみ影響します。
<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に追加します:
<Switch
android:trackTint="@drawable/newtrack"
android:thumbTint="@drawable/newthumb"
/>
trackTint
か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を作成し、それをセレクターで「チェック済み」の状態に割り当てる必要があります。
最も簡単な方法は、トラックの色合いを定義し、色合いモードを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"/>
あなたはスタンダール使用している場合ことを覚えておいてください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
後でこのカスタムセレクタをポイントすることを忘れないでください。