【问题标题】: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>

【问题讨论】:

标签: android styles


【解决方案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

      【讨论】:

      • 问题是,我想要多个父属性。
      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多