A resposta sugerida aqui não funciona corretamente no Android 5.0 se sua lista de estados de cores com base em XML faz referência a atributos temáticos. Por exemplo, eu tenho uma lista de estados de cores xml como esta:
<?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 isso como meu backgroundTint de xml funciona muito bem no Android 5.0 e em tudo o mais. No entanto, se eu tentar definir isso em um código como este:
(Não faça isso)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
Na verdade, não importa se eu passo a Activity ou o contexto do botão para o método ContextCompat.getColorStateList (), nem me dá a lista de estados de cores adequada com relação ao tema do botão. Isso ocorre porque o uso de atributos de tema em listas de estados de cores não era compatível até que a API 23 e o ContextCompat não fizessem nada de especial para resolvê-los. Em vez disso, você deve usar AppCompatResources.getColorStateList (), que faz sua própria análise de recurso / resolução de atributo de tema em dispositivos <API 23.
Em vez disso, você deve usar isto:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: use AppCompatResources e não -ContextCompat- se precisar de recursos temáticos resolvidos em todas as versões de API do Android.
Para obter mais informações sobre o assunto, consulte este artigo .