我知道我可以为不同的 API 级别添加不同的 XML,例如为 values-v21 和 values-v19 使用不同的样式。我想了解的是构建系统实际上如何处理这些不同的值?因此,例如,如果我的大部分样式在所有 API 中都是通用的,并且一种样式中的一项在 21 和其他样式之间发生变化,我是否:
1)将整个styles.xml复制到v21中,并更改我需要更改的一个值
2) v21下只添加那个改成styles.xml的样式
3) 只添加在 21 岁以下改变的那一种风格的那一件
这很令人困惑,我找不到任何关于构建过程如何处理合并样式的文档。
最佳答案
规则很明确:
- 在运行 Android 时 selects the best-matching style
如果所选样式是子样式,Android merges它的项目具有父级最佳匹配样式
如果您通过引用提供可变项目,只需定义其值以匹配所选的 api 版本。
<style name="SomeStyle"> <item name="someColor">@color/some_color</item> </style>
您可以在 color-v21
文件夹中为 API 21 提供 some_color.xml
,在 color
文件夹中提供此文件的通用版本所有其他 API 级别。
示例:
您想为非 v21 API 使用以下样式
<style name="FinalStyle">
<item name="commonText">It\'s a common text</item>
<item name="specificDrawable">@drawable/icon</item>
<item name="specificColor">@color/primary_color</item>
<item name="specificText">non-v21</item>
</style>
以及 v21 API 的以下样式
<style name="FinalStyle">
<item name="commonText">It\'s a common text</item>
<item name="specificDrawable">@drawable/icon</item>
<item name="specificColor">@color/secondary_color</item>
<item name="specificText">v21</item>
</style>
v21/non-v21 API 具体参数不同,通用参数通用。
怎么做?
res/values/styles.xml
<style name="BaseStyle"> <item name="commonText">It\'s a common text</item> <item name="specificDrawable">@drawable/icon</item> </style> <style name="FinalStyle" parent="BaseStyle"> <item name="specificColor">@color/primary_color</item> <item name="specificText">non-v21</item> </style>
res/values-v21/styles.xml
<style name="FinalStyle" parent="BaseStyle"> <item name="specificColor">@color/secondary_color</item> <item name="specificText">v21</item> </style>
res/drawable/icon.png
常用图标res/drawable-v21/icon.png
v21 图标
Android 在FinalStyle
中搜索v21 时,会从res/values-v21
中选择FinalStyle
定义作为最佳匹配样式,并与基本样式
。在此示例中,还有另一个最佳匹配资源搜索,当 Android 搜索 @drawable/icon
时。
关于android - 根据构建时的 Android 版本更改主题和样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31050289/