2016-09-14 51 views
0

我正在開發Android應用程序,我必須支持API 19和更高版本。所以,我的風格結構是這樣的:如何使用Android樣式繼承不同的限定符

res 
    values 
      styles.xml 
    values-v21 
      styles.xml 

styles.xml

<style name="customButton" parent="Base.Widget.AppCompat.Button"> 
    <item name="android:focusable">false</item> 
    <item name="android:clickable">true</item> 
</style> 

,並在v21/styles.xml

<style name="customButton" parent="customButton"> 
    <item name="android:elevation">10dp</item> 
</style> 

雖然這個工作,它看起來不正確。 Android工作室正在抱怨循環引用。那是因爲v21/customButton在技術上本身就是父母。

我不能將v21/customButton重命名爲customButton21,因爲那樣我就不得不使用這種風格創建兩個版本。雖然唯一不同的是在API 21中添加的新屬性。

解決此問題的正確方法是什麼?也許創建base-style.xml,然後在特定的API風格中引用它?

PS:這個問題適用於任何限定符,不僅僅是API。

回答

0

我已經解決了以下解決方案:

attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="buttonStyle" format="reference" /> 
</resources> 

值/ styles.xml

<resources> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <item name="@attr/buttonStyle">@style/buttonStyleBase</item> 
    </style> 

    <style name="buttonStyleBase"> 
     <item name="android:gravity">left</item> 
     <item name="android:textSize">20sp</item> 
    </style> 
</resources> 

值-V21/styles.xml

<resources> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <item name="@attr/buttonStyle">@style/buttonStyle21</item> 
    </style> 

    <style name="buttonStyle21" parent="buttonStyleBase"> 
     <item name="android:elevation">15dp</item> 
    </style> 
</resources> 

然後使用它:

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" 
     style="?attr/buttonStyle" /> 

這樣我可以承受,因爲我需要它可以是複雜的,而且只適用是相關的另一個SDK版本變化的基本樣式。