Jawaban yang disarankan di sini tidak berfungsi dengan baik pada android 5.0 jika daftar status warna berbasis XML Anda merujuk pada atribut bertema .. Misalnya, saya memiliki daftar status warna xml seperti:
<?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>
Menggunakan ini sebagai backgroundTint saya dari xml berfungsi dengan baik di Android 5.0 dan yang lainnya. Namun jika saya mencoba mengatur ini dalam kode seperti ini:
(Jangan lakukan ini)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
Sebenarnya tidak masalah jika saya meneruskan Aktivitas atau konteks tombol ke metode ContextCompat.getColorStateList (), tidak ada yang memberi saya daftar status warna yang sesuai sehubungan dengan tema tempat tombol berada. Ini karena penggunaan atribut tema dalam daftar status warna tidak didukung hingga api 23 dan ContextCompat tidak melakukan sesuatu yang khusus untuk mengatasinya. Sebagai gantinya, Anda harus menggunakan AppCompatResources.getColorStateList () yang melakukan resolusi atribut parsing / tema sumber dayanya sendiri pada perangkat <API 23.
Sebaliknya, Anda harus menggunakan ini:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: gunakan AppCompatResources dan bukan -ContextCompat- jika Anda perlu menyelesaikan resource bertema di semua versi API android.
Untuk informasi lebih lanjut tentang topik tersebut, lihat artikel ini .