Пропонована відповідь тут не працює належним чином на 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>
Використовуючи це як мій backgroundTint від xml, добре працює на android 5.0 та все інше. Однак якщо я спробую встановити це в такому коді:
(Не робіть цього)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
Насправді неважливо, чи я передаю активність або контекст кнопки методу ContextCompat.getColorStateList (), і не дасть мені належного списку стану кольорів щодо теми, в якій знаходиться кнопка. Це тому, що використання атрибутів теми у списках кольорів не підтримувалось до 23 квітня, і ContextCompat не зробить нічого особливого для їх вирішення. Натомість ви повинні використовувати AppCompatResources.getColorStateList (), який робить власний розбір ресурсів / атрибут теми на пристроях <API 23.
Натомість ви повинні використовувати це:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: використовуйте AppCompatResources, а не -ContextCompat-, якщо вам потрібні вирішені тематичні ресурси для всіх версій API для Android.
Більш детальну інформацію по темі див. У цій статті .