使用 属性 androidTextapperance 与 属性 样式时的继承问题

Inheritance issue, when using property androidTextapperance vs. property style

我有一个根主题和一个继承子主题:

<resources>
    <color name="colorRed">#FF0000</color>
    <color name="colorGreen">#00FF00</color>

    <style name="Root" parent="Theme.AppCompat.Light.DarkActionBar" />

    <style name="Root.TextAppearance" parent="android:TextAppearance">
        <item name="android:textColor">@color/colorGreen</item>
    </style>

    <style name="Child" parent="Root">
        <item name="android:textColor">@color/colorRed</item>
    </style>

</resources> 

在清单文件中我设置了主题Child。在布局中,我应用根主题中的文本外观:

<TextView
    android:textAppearance="@style/Root.TextAppearance"
    android:text="Hello World!"

Root.TextAppearance如何继承红色?

您应该设置样式而不是 textAppearance

style="@style/Root.TextAppearance"

同样在样式中 Root.TextAppearance 应该将 Root 作为父级

<style Root.TextAppearance parent="android:TextAppearance">

比设置 android:textAppearance="@style/Root.TextAppearance" 应该有效

进行一些更改将颜色代码放入 color.xml

    <color name="colorRed">#FF0000</color>
<color name="colorGreen">#00FF00</color>

然后试试这个..

        android:textAppearance="@style/Root.TextAppearance"

检查优先顺序

对该问题的简短回答是,主题优先于 android:textAppearance

Android 有不同类型的层次结构。使用 styles 属性时,样式层次结构按预期应用。假设styles层级也申请android:textAppearance属性显然失败了

主题还有另一个层次结构。该层次结构遵循布局树。主题 Child 应用在清单中,是顶层。

似乎这个顶级主题的设置甚至否决了较低级别的 android:textAppearance 的设置。这仍然感觉不对,因为较低级别通常应该覆盖较高级别。

所以我通过应用属性 styleandroid:themeandroid:textAppearannce 进行了一些测试,以找出它们的强度顺序。

原来texAppearance最弱,style最强:

  1. style
  2. android:theme
  3. android:textAppearance

我认为这就是为什么更高级别的 theme 可以覆盖较低级别的 android:textAppearance 的原因。我承认我发现 textAppearance 的低优先级相当混乱。这不是我预期的工作方式。然而,这就是我发现正在测试的结果。