La risposta suggerita qui non funziona correttamente su Android 5.0 se l'elenco di stato del colore basato su XML fa riferimento ad attributi a tema. Ad esempio, ho un elenco di stato del colore xml in questo modo:
<?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>
Usarlo come backgroundTint da xml funziona perfettamente su Android 5.0 e tutto il resto. Tuttavia, se provo a impostarlo in un codice come questo:
(Non farlo)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
In realtà non importa se passo l'attività o il contesto del pulsante al metodo ContextCompat.getColorStateList (), né mi fornirà l'elenco di stato del colore corretto rispetto al tema in cui si trova il pulsante. Questo perché l'uso degli attributi del tema negli elenchi di stato dei colori non era supportato fino a quando api 23 e ContextCompat non fa nulla di speciale per risolverli. Invece è necessario utilizzare AppCompatResources.getColorStateList () che esegue la propria analisi delle risorse / risoluzione degli attributi del tema sui dispositivi <API 23.
Invece, devi usare questo:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: usa AppCompatResources e non -ContextCompat- se avrai bisogno di risorse a tema risolte in tutte le versioni API di Android.
Per ulteriori informazioni sull'argomento, vedere questo articolo .