Sugerowana odpowiedź tutaj nie działa poprawnie w systemie Android 5.0, jeśli lista stanów kolorów oparta na XML odwołuje się do atrybutów tematycznych. Na przykład mam listę stanów kolorów XML, taką jak ta:
<?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>
Używanie tego jako mojego backgroundTint z xml działa dobrze na Androidzie 5.0 i wszystkim innym. Jeśli jednak spróbuję ustawić to w kodzie w ten sposób:
(Nie rób tego)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
Właściwie nie ma znaczenia, czy przekażę Activity lub kontekst przycisku do metody ContextCompat.getColorStateList (), ani nie poda mi właściwej listy stanów kolorów w odniesieniu do motywu, w którym znajduje się przycisk. Dzieje się tak, ponieważ używanie atrybutów motywu na listach stanu kolorów nie było obsługiwane przed api 23, a ContextCompat nie robi nic specjalnego, aby je rozwiązać. Zamiast tego należy użyć AppCompatResources.getColorStateList (), która wykonuje własne analizowanie zasobów / rozpoznawanie atrybutów motywu na urządzeniach <API 23.
Zamiast tego musisz użyć tego:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: użyj AppCompatResources, a nie -ContextCompat-, jeśli potrzebujesz rozwiązanych zasobów tematycznych we wszystkich wersjach interfejsu API Androida.
Więcej informacji na ten temat znajdziesz w tym artykule .