如果您的基于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));
实际上,我是否将Activity或按钮的上下文传递给ContextCompat.getColorStateList()方法都没有关系,也都不会为我提供关于按钮所在主题的正确颜色状态列表。这是因为直到api 23和ContextCompat都不做任何特殊的操作来解决这些问题,才支持在颜色状态列表中使用主题属性。相反,您必须使用AppCompatResources.getColorStateList()在设备<API 23上执行自己的资源解析/主题属性解析。
相反,您必须使用以下命令:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR:使用AppCompatResources如果您需要在所有API版本的android中解析主题资源,请而不是-ContextCompat-。
有关该主题的更多信息,请参见本文。