如何获取适配低版本Android的API 26文本颜色行为支持库?
?textColorPrimary颜色计算逻辑到旧版本设备 你提到的API 26引入的?textColorPrimary基于?colorForeground的动态计算逻辑,确实在旧版本(比如API 23)上没有原生支持,但我们有几个靠谱的方案来让旧设备也能用上这个逻辑:
1. 手动复刻Selector资源
最简单直接的方式就是自己创建和API 26原生逻辑一致的颜色selector文件,放到你的项目res/color目录下:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:alpha="?attr/disabledAlpha" android:color="?attr/colorForeground"/> <item android:alpha="?attr/primaryContentAlpha" android:color="?attr/colorForeground"/> </selector>
然后在你的主题里覆盖textColorPrimary属性,指向这个自定义的selector:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 其他主题属性 --> <item name="android:textColorPrimary">@color/text_color_primary</item> <!-- 兼容AppCompat库 --> <item name="textColorPrimary">@color/text_color_primary</item> </style>
这样不管是API 23还是更高版本,都会使用你定义的这个selector逻辑,避免旧版本回退到白色的问题。
2. 使用Material Components库的兼容支持
如果你已经在使用Material Components for Android库,它已经内置了对这种动态颜色计算的向下兼容逻辑。只要你的主题继承自Material Components的主题(比如Theme.MaterialComponents.DayNight),textColorPrimary就会自动应用类似API 26的计算逻辑,并且在旧版本设备上也能正常工作。
需要注意的是,Material Components库会自动处理disabledAlpha和primaryContentAlpha这些属性的默认值,如果你需要自定义这些透明度,也可以在主题里直接覆盖:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="disabledAlpha">0.38</item> <item name="primaryContentAlpha">1.0</item> </style>
关于API 23回退到白色的机制补充
其实API 23及以下版本的原生textColorPrimary并没有基于colorForeground的动态计算,它的默认值是根据主题的明暗模式来定的——比如在Light主题下默认是黑色,Dark主题下默认是白色,这就是你看到回退到白色的原因。而API 26之后才引入了基于colorForeground结合透明度属性的动态逻辑。
内容的提问来源于stack exchange,提问作者Blcknx

