La réponse suggérée ici ne fonctionne pas correctement sur Android 5.0 si votre liste d'états de couleurs basée sur XML fait référence à des attributs thématiques. Par exemple, j'ai une liste d'états de couleurs xml comme ceci:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorPrimary" android:state_enabled="true"/>
<item android:alpha="0.12" android:color="?attr/colorOnSurface"/>
</selector>
Utiliser ceci comme arrière-planTint de xml fonctionne très bien sur Android 5.0 et tout le reste. Cependant, si j'essaie de définir cela dans un code comme celui-ci:
(Ne fais pas ça)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
En fait, peu importe si je transmets l'activité ou le contexte du bouton à la méthode ContextCompat.getColorStateList (), ni l'un ni l'autre ne me donnera la liste d'état de couleur appropriée par rapport au thème dans lequel se trouve le bouton. En effet, l'utilisation d'attributs de thème dans les listes d'états de couleurs n'était pas prise en charge avant l'api 23 et ContextCompat ne fait rien de spécial pour les résoudre. À la place, vous devez utiliser AppCompatResources.getColorStateList () qui effectue sa propre analyse syntaxique des ressources / résolution d'attributs de thème sur les appareils <API 23.
Au lieu de cela, vous devez utiliser ceci:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: utilisez AppCompatResources et non -ContextCompat- si vous avez besoin de ressources thématiques résolues dans toutes les versions d'API d'Android.
Pour plus d'informations sur le sujet, consultez cet article .