XMLベースのカラーステートリストがテーマ属性を参照している場合、ここで推奨される回答はAndroid 5.0では適切に機能しません。たとえば、次のような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からのbackgroundTintとして使用すると、android 5.0やその他すべてで問題なく機能します。ただし、これを次のようなコードで設定しようとすると、
(これを行わないでください)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
アクティビティまたはボタンのコンテキストをContextCompat.getColorStateList()メソッドに渡しても、実際には問題ではありません。ボタンが含まれているテーマに関して、適切なカラー状態リストも表示されません。これは、カラーステートリストでのテーマ属性の使用がapi 23までサポートされず、ContextCompatがこれらを解決するために特別なことを何も行わなかったためです。代わりに、デバイス<API 23で独自のリソース解析/テーマ属性解決を行うAppCompatResources.getColorStateList()を使用する必要があります。
代わりに、これを使用する必要があります。
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR:AndroidのすべてのAPIバージョンでテーマ化されたリソースを解決する必要がある場合は、-ContextCompat- ではなくAppCompatResourcesを使用します。
このトピックの詳細については、この記事を参照してください。