Comment changer la couleur de piste d’un SwitchCompat

J’ai essayé d’utiliser le lien suivant pour changer la couleur d’un SwitchCompat:

Comment changer la couleur d’un SwitchCompat

Remarquez le faible contraste de mon commutateur:

Le switchcompat

Mais après avoir modifié toutes les valeurs de couleur pertinentes, la piste (le gris le plus clair) du SwitchCompat rest la même. Je ne veux pas changer d’apparence sauf la couleur. Le pouce est en rose et je veux que la piste soit contrastée. Ai-je manqué de définir une valeur dans mes styles.xml?

J’ai essayé ces valeurs (couleurs aléatoires non blanches):

 @color/first @color/second @color/third ... @color/first @color/first @color/second @color/second @color/second ...> 

J’ai eu le même problème et l’ai résolu.

  

Je lis le code de l’application et le comprends.

android.support.v7.internal.widget.TintManager.java

 private ColorStateList getSwitchTrackColorStateList() { if (mSwitchTrackStateList == null) { final int[][] states = new int[3][]; final int[] colors = new int[3]; int i = 0; // Disabled state states[i] = new int[] { -android.R.attr.state_enabled }; colors[i] = getThemeAttrColor(android.R.attr.colorForeground, 0.1f); i++; states[i] = new int[] { android.R.attr.state_checked }; colors[i] = getThemeAttrColor(R.attr.colorControlActivated, 0.3f); i++; // Default enabled state states[i] = new int[0]; colors[i] = getThemeAttrColor(android.R.attr.colorForeground, 0.3f); i++; mSwitchTrackStateList = new ColorStateList(states, colors); } return mSwitchTrackStateList; } 

Vous trouverez ci-dessous la méthode AppCompat pour modifier à la fois la piste et la couleur du pouce par programmation , pour un SwitchCompat spécifique. Pour cet exemple, j’ai codé en dur le thumbColor en rouge. Idéalement, vous définiriez la couleur via un second paramètre de méthode.

Veuillez noter que lorsque le commutateur est coché, une ondulation est affichée. La couleur de l’ondulation ne sera pas modifiée par le code ci-dessous.

 public static void setSwitchColor(SwitchCompat v) { // thumb color of your choice int thumbColor = Color.RED; // trackColor is the thumbColor with 30% transparency (77) int trackColor = Color.argb(77, Color.red(thumbColor), Color.green(thumbColor), Color.blue(thumbColor)); // setting the thumb color DrawableCompat.setTintList(v.getThumbDrawable(), new ColorStateList( new int[][]{ new int[]{android.R.attr.state_checked}, new int[]{} }, new int[]{ thumbColor, Color.WHITE })); // setting the track color DrawableCompat.setTintList(v.getTrackDrawable(), new ColorStateList( new int[][]{ new int[]{android.R.attr.state_checked}, new int[]{} }, new int[]{ trackColor, Color.parseColor("#4D000000") // full black with 30% transparency (4D) })); } 
  Here is Switch Layout -Adding theme to your switch to change the color of track.Check the style given below:-. **Switch Compact**   @android:color/white @android:color/blue @android:color/white @color/white  

Où trackTint changera votre couleur de piste

Si vous voulez plus de commutateurs dans plusieurs couleurs dans une même activité, vous pouvez utiliser cette solution (basée sur le thème de @Konifar):

  

@color/custom est la couleur du pouce lorsque le commutateur est activé.

Appliquez ensuite ce thème à votre SwitchCompat de la manière suivante:

  

J’avais le même problème. Finalement résolu le programme avec ce code Kotlin

 fun tintSwitchButton(sw: SwitchCompat, resolvedColor: Int) { val states = arrayOf( intArrayOf(-android.R.attr.state_pressed), intArrayOf(android.R.attr.state_pressed) ) DrawableCompat.setTintList(sw?.trackDrawable, ColorStateList( states, intArrayOf(resolvedColor, resolvedColor) )) DrawableCompat.setTintList(sw?.thumbDrawable, ColorStateList( states, intArrayOf(Color.WHITE, Color.WHITE) )) } 

Et l’appel de fonction est

 tintSwitchButton(switchCompat, Color.rgb(214, 0, 0)) 

Vous pouvez également créer une fonction d’extension:

 fun SwitchCompat.tint(resolvedColor: Int) { val states = arrayOf( intArrayOf(-android.R.attr.state_pressed), intArrayOf(android.R.attr.state_pressed) ) DrawableCompat.setTintList(trackDrawable, ColorStateList( states, intArrayOf(resolvedColor, resolvedColor) )) DrawableCompat.setTintList(thumbDrawable, ColorStateList( states, intArrayOf(Color.WHITE, Color.WHITE) )) } 

Donc, l’appel serait plus facile

 switchCompat.tint(Color.rgb(214,0,0)) 

utilisez simplement colorControlActivated pour définir la couleur de la piste et du pouce de SwitchCompat.

Si elle n’est pas définie, la couleur colorControlActivated par défaut utilisera colorAccent. (de l’expérience, toujours pas trouver où dans le code source).

Le code source a changé et ne ressemble toujours pas à @Ovidiu. Mais merci encore de me faire savoir pour trouver la réponse du code source.

 mThumbDrawable = a.getDrawable(R.styleable.SwitchCompat_android_thumb); 

appellera éventuellement la méthode suivante.

/frameworks/support/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java

 private ColorStateList createSwitchTrackColorStateList(Context context) { final int[][] states = new int[3][]; final int[] colors = new int[3]; int i = 0; // Disabled state states[i] = ThemeUtils.DISABLED_STATE_SET; colors[i] = getThemeAttrColor(context, android.R.attr.colorForeground, 0.1f); i++; states[i] = ThemeUtils.CHECKED_STATE_SET; colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated, 0.3f); i++; // Default enabled state states[i] = ThemeUtils.EMPTY_STATE_SET; colors[i] = getThemeAttrColor(context, android.R.attr.colorForeground, 0.3f); i++; return new ColorStateList(states, colors); } private ColorStateList createSwitchThumbColorStateList(Context context) { final int[][] states = new int[3][]; final int[] colors = new int[3]; int i = 0; final ColorStateList thumbColor = getThemeAttrColorStateList(context, R.attr.colorSwitchThumbNormal); if (thumbColor != null && thumbColor.isStateful()) { // If colorSwitchThumbNormal is a valid ColorStateList, extract the default and // disabled colors from it // Disabled state states[i] = ThemeUtils.DISABLED_STATE_SET; colors[i] = thumbColor.getColorForState(states[i], 0); i++; states[i] = ThemeUtils.CHECKED_STATE_SET; colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated); i++; // Default enabled state states[i] = ThemeUtils.EMPTY_STATE_SET; colors[i] = thumbColor.getDefaultColor(); i++; } else { // Else we'll use an approximation using the default disabled alpha // Disabled state states[i] = ThemeUtils.DISABLED_STATE_SET; colors[i] = getDisabledThemeAttrColor(context, R.attr.colorSwitchThumbNormal); i++; states[i] = ThemeUtils.CHECKED_STATE_SET; colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated); i++; // Default enabled state states[i] = ThemeUtils.EMPTY_STATE_SET; colors[i] = getThemeAttrColor(context, R.attr.colorSwitchThumbNormal); i++; } return new ColorStateList(states, colors); } 

Si vous souhaitez personnaliser la couleur de la piste, vous pouvez utiliser cette solution.

track selector.xml

        

où checked_color et unchecked_color sont la couleur de vos choix.

styles.xml

   

fichier de mise en page