样式多重继承

Posted

技术标签:

【中文标题】样式多重继承【英文标题】:styles multiple inheritance 【发布时间】:2011-03-16 12:27:33 【问题描述】:

有没有办法让一个样式继承自多个其他样式,而不是仅仅局限于:

<style name="WidgetTextBase">
    <item name="android:typeface">serif</item>
    <item name="android:textSize">12dip</item>
    <item name="android:gravity">center</item>
</style>

<style name="BOSText" parent="WidgetTextBase">
    <item name="android:textColor">#051C43</item>
</style>

我希望 BOSText 也继承自:

<style name="WidgetTextHeader">
    <item name="android:textStyle">bold</item>
<style>

【问题讨论】:

这可能有用吗? ***.com/questions/4851175/… 【参考方案1】:

样式不支持多重继承(至少从 Android 3.2 开始不支持)。

官方docs说:

如果您使用点符号来扩展样式,并且您还包括 父属性,然后父样式覆盖任何样式 通过点符号继承。

【讨论】:

对不起,你错了。见链接developer.android.com/guide/topics/ui/… 您误解了这个问题(请参阅下面我对您的回答的评论)。你是对的,你可以构建像 A > B > C 这样的样式继承链。但问题是你是否可以做 (A, B) > C。即,一个样式继承自两个独立的继承链。 为什么设置为接受的答案?样式确实支持多重继承。 parent 属性为您提供一个继承,您可以从样式名称获得第二个继承,例如:&lt;style name="Text.Bold" /&gt; 将继承名为 Text 的样式。来自文档:Note: If you use the dot notation to extend a style, and you also include the parent attribute, then the parent styles override any styles inheritted through the dot notation. @Darwind 这是错误的。您不能从多个样式继承。当您同时使用点表示法和父属性时,all 点表示法中的样式根本不会应用,无论父属性的样式中是否存在样式. 这个答案是对的。文档摘录:“如果您使用点符号来扩展样式,并且还包含 parent 属性,则父样式会覆盖通过点符号继承的任何样式。”【参考方案2】:

对于那些正在寻找将多种不同样式合并为一个的解决方案的人,您可以使用

public void applyStyle (int resId, boolean force)

https://developer.android.com/reference/android/content/res/Resources.Theme#applyStyle(int,%20boolean)。 并以这种方式应用它

context.theme.applyStyle(R.style.MyAdditionalStyle, false)

当您指定true 作为第二个参数时,它会覆盖您主题中的现有值,而当false 它只添加来自R.style.MyAdditionalStyle 的非重叠值

我还没有测试过多种样式的场景,但是根据文档你可以实现它。这就是这种方法可以用作多重继承的替代方法的方式。

【讨论】:

【参考方案3】:

您只能继承一种样式。但是,您也可以使继承的样式继承自另一个样式,依此类推:

<style name="WidgetTextBase">
    <item name="android:typeface">serif</item>
    <item name="android:textSize">12dip</item>
    <item name="android:gravity">center</item>
</style>

<style name="WidgetTextHeader" parent="WidgetTextBase">
    <item name="android:textStyle">bold</item>
</style>

<style name="BOSText" parent="WidgetTextHeader">
    <item name="android:textColor">#051C43</item>
</style>

您不能继承多个样式,但您可以设置一个继承链。

【讨论】:

【参考方案4】:

样式标签上有一个父属性,应该可以让您从其他样式继承...

<style name="CodeFont" parent="@style/WidgetTextBase">
   <item name="android:textStyle">bold</item>
</style>

http://developer.android.com/guide/topics/ui/themes.html

【讨论】:

问题是,我想要多个父属性。

以上是关于样式多重继承的主要内容,如果未能解决你的问题,请参考以下文章

Python 的 super() 如何与多重继承一起工作?

多重继承,虚基类

java中的多重继承是啥意思?

什么是多重继承,单重继承?

多继承 与 多重继承

理解虚基类多重继承的问题