通过主题更改表面和背景上 Material TextView 的文本颜色

Ric*_*ard 5 android android-theme android-studio material-design material-components-android

我遵循材料设计关于如何进行颜色主题的指南。我们可以更改一些已经定义的属性来自定义某个组件的颜色和/或形状。与颜色主题相关的一些有用的属性包括:(colorSurface例如改变组件的填充颜色Material Card)、colorSecondary(例如改变FAB的填充颜色)以及colorOnSecondary(例如改变FAB图标的填充颜色)。

目前,我有两个资源目录:valuesvalues-night分别用于浅色主题和深色主题的 UI。它们控制分配给颜色属性的颜色值。代码:

<!-- Light-themed UI color values -->
<?xml version="1.0" encoding="utf-8"?> 
<resources>
    <color name="colorPrimary">#546e7a</color>
    <color name="colorPrimaryVariant">#29434e</color>
    <color name="colorOnPrimary">#ffffff</color>
    <color name="colorSecondary">#d81b60</color>
    <color name="colorSecondaryVariant">#a00037</color>
    <color name="colorOnSecondary">#000000</color>
    <color name="colorSurface">#ffffff</color>
</resources>

<!-- Dark-themed UI color values -->
<?xml version="1.0" encoding="utf-8"?> 
<resources>
    <color name="colorPrimary">#546e7a</color>
    <color name="colorPrimaryVariant">#29434e</color>
    <color name="colorOnPrimary">#ffffff</color>
    <color name="colorSecondary">#d81b60</color>
    <color name="colorSecondaryVariant">#a00037</color>
    <color name="colorOnSecondary">#000000</color>
    <color name="colorSurface">#000000</color>
</resources>

<!-- Style resource file that changes in accordance to current default night mode -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryVariant</item>
    <item name="colorOnPrimary">@color/colorOnPrimary</item>
    <item name="colorSecondary">@color/colorSecondary</item>
    <item name="colorOnSecondary">@color/colorOnSecondary</item>
    <item name="colorSurface">@color/colorSurface</item>
    <item name="colorOnSurface">@color/colorOnSurface</item>
</style>
Run Code Online (Sandbox Code Playgroud)

某些组件(例如按钮)上的文本受colorOnPrimary. 当组件同时使用colorPrimary和时colorOnPrimary,我可以很好地控制使用的颜色。然而,组件的颜色(如Material TextView's color)并不依赖于colorOnSurface,而是可以通过特殊属性(如 )进行修改textAppearanceHeadline1。当然,我可以简单地修改android:textColorontextAppearanceHeadline1以遵循 的颜色colorOnSurface。但是,Material TextView有时会出现在背景(而不是表面)上,当发生这种情况时,我希望android:textColor具有该值colorOnBackground

我可能可以将样式应用于colorOnSurface所有样式,并且仅当 a确实出现在背景上时才Material TextView覆盖样式。但是,有什么方法可以根据文本出现的位置自动更改使用的值吗?colorOnBackgroundMaterial TextViewandroid:textColor