2016-09-14 40 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版本变化的基本样式。