Câu trả lời được đề xuất ở đây không hoạt động đúng trên android 5.0 nếu danh sách trạng thái màu dựa trên XML của bạn tham chiếu đến các thuộc tính theo chủ đề. Ví dụ: tôi có danh sách trạng thái màu xml như sau:
<?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>
Sử dụng nó làm backgroundTint từ xml của tôi hoạt động tốt trên android 5.0 và mọi thứ khác. Tuy nhiên, nếu tôi cố gắng đặt điều này trong mã như thế này:
(Đừng làm điều này)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
Thực ra không có vấn đề gì nếu tôi chuyển Activity hoặc ngữ cảnh của nút sang phương thức ContextCompat.getColorStateList (), cả hai đều không cung cấp cho tôi danh sách trạng thái màu thích hợp đối với chủ đề mà nút đó ở trong. Điều này là do việc sử dụng các thuộc tính chủ đề trong danh sách trạng thái màu không được hỗ trợ cho đến api 23 và ContextCompat không thực hiện bất kỳ điều gì đặc biệt để giải quyết những điều này. Thay vào đó, bạn phải sử dụng AppCompatResources.getColorStateList () để phân tích cú pháp tài nguyên / phân giải thuộc tính chủ đề của riêng nó trên các thiết bị <API 23.
Thay vào đó, bạn phải sử dụng cái này:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: sử dụng AppCompatResources chứ không phải -ContextCompat- nếu bạn cần tài nguyên theo chủ đề đã giải quyết trên tất cả các phiên bản API của android.
Để biết thêm thông tin về chủ đề, hãy xem bài viết này .