2016-09-21 1 views
0

L'arrière-plan de ma case à cocher est spécifié via XML dépliable et je souhaite changer la couleur de ces éléments via le code. Un contrôle différent dans Android semble avoir différentes façons de définir sa couleur.Comment changer la couleur de la case à cocher drawable spécifiée en xml?

<Checkbox android:button="@drawable/custom_checkbox" /> 

Dans drawable/custom_checkbox.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true" android:drawable="@drawable/checked" /> 
    <item android:state_checked="false" android:drawable="@drawable/unchecked" /> 
</selector> 

La plupart des réponses à l'arrêt SO à la solution ci-dessus. Je suis capable de changer la couleur via le code suivant mais ce code ne fonctionnera pas dans certains niveaux d'API (par exemple le niveau 17). J'aimerais quelque chose qui fonctionne dans tous les domaines.

Drawable d = DrawableCompat.wrap(checkbox.getBackground()); 
DrawableCompat.setTint(d, newColor); 
+0

double possible de [Android, couleur de l'icône TabLayout ne change pas lors du déplacement] (http: // stackoverflow. com/questions/39475790/android-tablayout-icon-couleur-doesnt-change-when-dragging) –

+0

Je ne crois pas que ce soit un doublon. Je demande à propos de Checkbox, pas d'onglet. La solution a également une liste de couches dans son exemple, ce que je ne fais pas. – Boon

+0

Oui c'est. La réponse acceptée dans ce fil montre, comment teinter l'état drawable sur tous les niveaux d'API. –

Répondre

0

peut-être que this vous aide.

et je pense que ceci: android:buttonTint="@color/mybrown" est un moyen simple

+0

Cette solution ne fonctionnera pas pour le niveau d'API 17 (ou éventuellement n'importe quoi sous le niveau d'API 21). – Boon

0

essayez ceci:

Drawable d = DrawableCompat.wrap(checkbox.getBackground()); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     DrawableCompat.setTint(d, newColor); 

    } else { 
     d.mutate().setColorFilter(newColor, PorterDuff.Mode.SRC_IN); 
    }