我正在使用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。
答案 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版本相关的更改。