使用属性AndroidTextAppearance与属性样式时的继承问题
我有一个根主题和一个继承子主题:使用属性AndroidTextAppearance与属性样式时的继承问题,android,android-layout,android-styles,Android,Android Layout,Android Styles,我有一个根主题和一个继承子主题: <resources> <color name="colorRed">#FF0000</color> <color name="colorGreen">#00FF00</color> <style name="Root" parent="Theme.AppCompat.Light.DarkActionBar" /> <style name="Root
<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>
- 预期:绿色文本
- 实际:红色文本
Root.TextAppearance
如何继承红色?您应该设置样式而不是TextAppearance
style="@style/Root.TextAppearance"
此外,在styles 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
Android有不同类型的层次结构。使用样式
属性时,样式层次结构将按预期应用。假设styles
层次结构也适用于android:textAppearance
属性,显然失败了
主题还有另一个层次结构。该层次结构沿着布局树向下延伸。主题子项
应用于清单中,是顶层
似乎这个顶级主题的设置甚至在较低的级别上否决了android:textAppearance
的设置。这仍然是错误的,因为较低的级别通常会覆盖较高的级别
因此,我通过应用属性style
、android:theme
和android:textapperance
来进行一些测试,以找出它们的优势顺序
结果表明,tex外观
最弱,风格
最强:
style
android:theme
android:textAppearance
我认为这就是为什么较高级别的
主题可以覆盖较低级别的android:textAppearance
的原因。我承认我发现textAppearance
的低优先级相当令人困惑。这不是我期望的工作方式。然而,这就是我在测试中发现的结果。事实!当我使用样式时,它起作用并且只起作用。很遗憾,我不能使用textAppearance来修改样式。给我一些时间来选择所有传入答案中最好的。这个确实有用,但并不完全令人满意。我破坏了我的主题概念,这在很大程度上取决于通过文本外观修改样式的选项。@Blcknx我已经编辑了答案。它不起作用,因为您的TextAppearance样式没有父项。所以它无法从中继承textColor属性。谢谢@TibiG。我试过了。它不会改变结果。我仍然认为这是一个错误。它不会继承textColor属性,因为我会覆盖它。它确实继承了其他五个属性,我没有使用。@Blcknx似乎是合法的:)谢谢,但这不是原因。我将un PUSIONE放入一个文件中,以保持测试用例最简单。这里还提到了优先级顺序:
<color name="colorRed">#FF0000</color>
<color name="colorGreen">#00FF00</color>
android:textAppearance="@style/Root.TextAppearance"