Предлагаемый здесь ответ не работает должным образом на android 5.0, если ваш список состояний цвета на основе XML ссылается на тематические атрибуты. Например, у меня есть список состояний цвета xml, например:
<?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>
Использование этого в качестве фона из xml отлично работает на Android 5.0 и всем остальном. Однако, если я попытаюсь установить это в таком коде:
(Не делай этого)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
На самом деле не имеет значения, передаю ли я Activity или контекст кнопки методу ContextCompat.getColorStateList (), ни один из них не даст мне правильный список состояний цвета по отношению к теме, внутри которой находится кнопка. Это связано с тем, что использование атрибутов темы в списках состояний цвета не поддерживалось до тех пор, пока api 23 и ContextCompat не сделали ничего особенного для их решения. Вместо этого вы должны использовать AppCompatResources.getColorStateList (), который выполняет свой собственный синтаксический анализ ресурсов / разрешение атрибутов темы на устройствах <API 23.
Вместо этого вы должны использовать это:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TL; DR : используйте AppCompatResources, а не -ContextCompat-, если вам понадобятся разрешенные тематические ресурсы во всех версиях API Android.
Дополнительные сведения по теме см. В этой статье .