支持API 26的文本颜色行为?

时间:2018-05-23 07:54:30

标签: android android-layout android-support-library android-color

API 26基于?textColorPrimary?colorForeground引入了高级颜色计算。它使用状态primaryContentAlphadisabledAlpha

sdk/platforms/android-26/data/res/color/text_color_primary.xml

<?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>

在API 23上,它通过我未能弄清楚的方式回退到白色文本。

我是否可以申请支持库以获取旧设备的API 26颜色计算?

1 个答案:

答案 0 :(得分:0)

@ eugen-pechanec暗示缺少primaryContentAlphascondaryContentAlpha属性,恕我直言API 26以下。我们应该称这是一个错误还是缺少后端口?不知道。

结果是您无法使用设置?attr/colorForeground作为默认设置来自动创建开箱即用的所有前景色。你基本上有两个选择,要么不用它来做手动后端口。

禁用colorForground

您可以直接设置属性?attr/colorForegroundandroid:textColorPrimary,而不是从android:textColorSecondary生成颜色。在大多数情况下,这将是最佳选择。

Backport colorForground

如果您打算使用许多不同的主题,则需要启用该功能以在中心位置为所有文本颜色设置默认值。然后,您必须在根主题中实现API 26的行为。

root theme

    <!-- workaround to port back API 26+ behaviour -->

    <!-- below 26 these two attributes are missing in the android namespace -->
    <item name="primaryContentAlpha">1.0</item> 
    <item name="secondaryContentAlpha">.85</item>
    <!-- works below 26 -->
    <item name="android:disabledAlpha">.4</item>
    <!-- use my own files to connect my custom attributes -->
    <item name="android:textColorPrimary">@color/text_color_primary</item>
    <item name="android:textColorSecondary">@color/text_color_secondary</item> 

app/src/main/res/color/text_color_primary.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:alpha="?android:disabledAlpha" android:color="?android:attr/colorForeground" />
    <item android:alpha="?attr/primaryContentAlpha" android:color="?android:attr/colorForeground" />
</selector>

app/src/main/res/color/text_color_secondary.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:alpha="?android:disabledAlpha" android:color="?android:colorForeground"/>
    <item android:alpha="?secondaryContentAlpha" android:color="?android:colorForeground"/>
</selector>