样式多重继承
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
属性为您提供一个继承,您可以从样式名称获得第二个继承,例如:<style name="Text.Bold" />
将继承名为 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
【讨论】:
问题是,我想要多个父属性。以上是关于样式多重继承的主要内容,如果未能解决你的问题,请参考以下文章