La respuesta sugerida aquí no funciona correctamente en Android 5.0 si su lista de estado de color basada en XML hace referencia a atributos temáticos. Por ejemplo, tengo una lista de estado de color xml así:
<?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>
Usar esto como backgroundTint de xml funciona bien en Android 5.0 y todo lo demás. Sin embargo, si trato de configurar esto en un código como este:
(No hagas esto)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
En realidad, no importa si paso la actividad o el contexto del botón al método ContextCompat.getColorStateList (), ni me dará la lista de estado de color adecuada con respecto al tema en el que se encuentra el botón. Esto se debe a que no se admitió el uso de atributos de tema en listas de estado de color hasta api 23 y ContextCompat no hace nada especial para resolverlos. En su lugar, debe usar AppCompatResources.getColorStateList () que realiza su propio análisis de recursos / resolución de atributos de tema en dispositivos <API 23.
En su lugar, debes usar esto:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: use AppCompatResources y no -ContextCompat- si necesita recursos temáticos resueltos en todas las versiones de API de Android.
Para obtener más información sobre el tema, consulte este artículo .