在构建时基于Android版本更改主题和样式

vki*_*ins 6 android android-styles

我知道我可以为不同的API级别添加不同的XML,例如,为值-v21和values-v19设置不同的样式.我想要了解的是构建系统如何实际使用这些不同的值?因此,例如,如果我在所有API中都有大部分样式,并且一个样式中的一个项目在21和其他样式之间发生变化,那么我是否:

1)将整个styles.xml复制到v21中,并更改我需要更改的一个值

2)只在v21下添加一个更改为styles.xml的样式

3)只添加那个在21下改变的一个样式的项目

令人困惑,我找不到任何文档,如何构建的进程处理合并样式.

Dmi*_*try 10

规则很明确:

  1. 运行Android时选择最匹配的样式
  2. 如果选定的样式是子样式,则Android 会将其项目与父最佳匹配样式合并

    如果您通过引用提供可变项,只需定义其值以匹配选定的api版本.

    <style name="SomeStyle">
        <item name="someColor">@color/some_color</item>
    </style>
    
    Run Code Online (Sandbox Code Playgroud)

您可以some_color.xmlcolor-v21文件夹中的API 21和该文件的一个共同版本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>
Run Code Online (Sandbox Code Playgroud)

以及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>
Run Code Online (Sandbox Code Playgroud)

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>
    
    Run Code Online (Sandbox Code Playgroud)
  • res/values-v21/styles.xml

    <style name="FinalStyle" parent="BaseStyle">
        <item name="specificColor">@color/secondary_color</item>
        <item name="specificText">v21</item>
    </style>
    
    Run Code Online (Sandbox Code Playgroud)
  • res/drawable/icon.png 常见的图标

  • res/drawable-v21/icon.png v21图标

当Android搜索FinalStylev21时,它会FinalStyleres/values-v21最佳匹配样式中选择定义,并与之合并BaseStyle.在此示例中,当Android搜索时,还有另一个最匹配的资源搜索@drawable/icon.