如何使用具有不同限定符的Android样式继承

时间:2016-09-14 07:18:09

标签: android android-styles

我正在使用Android应用,我必须支持API 19及更高版本。所以我的样式结构如下所示:

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。

1 个答案:

答案 0 :(得分: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版本相关的更改。