คำตอบที่แนะนำที่นี่ทำงานไม่ถูกต้องบน 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 () หรือไม่ทั้งจะไม่ให้รายการสถานะสีที่เหมาะสมกับธีมที่ปุ่มอยู่ภายใน เนื่องจากไม่รองรับการใช้แอ็ตทริบิวต์ธีมในรายการสถานะสีจนกว่า api 23 และ ContextCompat จะไม่ทำอะไรเป็นพิเศษเพื่อแก้ไขสิ่งเหล่านี้ แต่คุณต้องใช้AppCompatResources.getColorStateList ()ซึ่งทำการแยกวิเคราะห์ทรัพยากร / ธีมความละเอียดของตัวเองบนอุปกรณ์ <API 23
คุณต้องใช้สิ่งนี้แทน:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR: ใช้AppCompatResourcesและไม่ใช่ -ContextCompat- หากคุณต้องการทรัพยากรที่ได้รับการแก้ไขในเวอร์ชัน API ทั้งหมดของ Android
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อที่ดูบทความนี้