样式多重继承

NPi*_*ike 40 android styles

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

<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>
Run Code Online (Sandbox Code Playgroud)

我希望BOSText也继承自:

<style name="WidgetTextHeader">
    <item name="android:textStyle">bold</item>
<style>
Run Code Online (Sandbox Code Playgroud)

Jon*_*nas 32

不,样式不支持多重继承(至少不支持Android 3.2).

  • 你误解了这个问题(见下面我对你的回答的评论).你是对的,你可以构建样式继承链,如A> B> C.但问题是你是否可以做(A,B)> CIe,一个样式继承自两个独立的继承链. (27认同)
  • 为什么将此设置为可接受的答案?样式确实支持多重继承。“ parent”属性为您提供一个继承,您可以从样式名称中获得第二个继承,例如:“ &lt;style name =“ Text.Bold” /&gt;`将从“ Text”样式继承。从文档中:`注:如果使用点符号扩展样式,并且还包含parent属性,则父样式将覆盖通过点符号继承的所有样式。 (6认同)
  • 对不起,但你错了.请参阅http://developer.android.com/guide/topics/ui/themes.html#DefiningStyles链接 (4认同)
  • @Darwind 这是错误的。您不能继承多种样式。当您同时使用点表示法和父属性时,无论父属性样式中是否存在样式,**根本**不会应用点表示法中的所有样式。 (4认同)

Cap*_*chi 9

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

<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>
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

public void applyStyle (int resId, boolean force)
Run Code Online (Sandbox Code Playgroud)

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

context.theme.applyStyle(R.style.MyAdditionalStyle, false)
Run Code Online (Sandbox Code Playgroud)

每当您指定true为第二个参数时,它都会覆盖主题中的现有值,并且当false它仅添加来自R.style.MyAdditionalStyle

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