styles multiple inheritance

19,559

Solution 1

Styles do not support multiple inheritance (at least not as of Android 3.2).

The official docs say:

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.

Solution 2

You can only inherit one style. However, you can also make the inherited style inherit from another style, and so on:

<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>

You can't inherit more than one style, but you can set up an inheritance chain.

Solution 3

For those who was looking for solution to just merge multiple different styles into one, you can use

public void applyStyle (int resId, boolean force)

https://developer.android.com/reference/android/content/res/Resources.Theme#applyStyle(int,%20boolean). And apply it that way

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

Whenever you specify true as second argument, it overrides existing values in your theme, and when false it adds only non-overlapping values from R.style.MyAdditionalStyle

I haven't tested scenario with multiple styles yet, but according to docs you can achieve it. So that's how this approach can be used as an alternative to multiple inheritance.

Share:
19,559

Related videos on Youtube

NPike
Author by

NPike

Updated on March 20, 2021

Comments

  • NPike
    NPike about 3 years

    Is there any way to make a style inherit from multiple other styles, instead of just being limited to:

    <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>
    

    I would like BOSText to also inherit from:

    <style name="WidgetTextHeader">
        <item name="android:textStyle">bold</item>
    <style>
    
  • NPike
    NPike about 13 years
    The problem is, I would like to have multiple parent attributes.
  • Roger Alien
    Roger Alien about 12 years
    Sorry, but You are wrong. See link developer.android.com/guide/topics/ui/…
  • Jonas
    Jonas about 12 years
    You misunderstood the question (see my comment on your answer below). You are right that you can construct style inheritance chains like A > B > C. The question though was whether you could do (A, B) > C. I.e., a style inherits from two independent inheritance chains.
  • Darwind
    Darwind over 5 years
    Why is this set as the accepted answer? Styles DO support multiple inheritance. The parent attribute gives you ONE inheritance and you can get a second inheritance from the name of the style, for instance: <style name="Text.Bold" /> will inherit from the style called Text. From the documentation: 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.
  • Richard
    Richard about 4 years
    @Darwind This is wrong. You cannot inherit from multiple styles. When you use both dot notation and the parent attribute, all the styles from the dot notation is not applied at all regardless of the presence of the styles in the parent-attribute's style.
  • WindRider
    WindRider about 4 years
    This answer is right. Excerpt from docs: "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."
  • Barry Fruitman
    Barry Fruitman about 2 years
    Damn that's an unclear message.