具有不同基本主题的 Android 风格

And*_*rew 7 android android-theme android-gradle-plugin

我正在开发一个具有多种风格的 android 项目。

这很好用,我可以自定义应用程序的元素,例如颜色和字符串资源。

我想让它使一些风格基于 AppCompat 浅色主题,有些风格基于 AppCompat 深色主题。

我知道我可以通过<items>在我的风格和每种风格中重复所有内容来实现这一点,将主题设置为指向每个应用程序的自定义清单中的每个主题,但这似乎有点过分。

有没有一些简单的方法来设置这样的主题

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">                
            <item name="colorPrimary">@color/primary_colour_tone1</item>
            ...lots more settings
    </style>
Run Code Online (Sandbox Code Playgroud)

但是不是直接指向 Theme.AppCompat.NoActionBar 指向在每个 gradle 构建中可以设置不同的引用?

所以像这样:

    <style name="AppTheme" parent="**Theme reference here**">                
            <item name="colorPrimary">@color/primary_colour_tone1</item>
            ...lots more settings
    </style>
Run Code Online (Sandbox Code Playgroud)

我试过使用 @string/theme_name 之类的东西,但这不起作用,有没有简单的方法来做到这一点?

Dev*_*rim 6

您可以sourceSets为一种或多种风格定义公共资源(也可以是源),这意味着您不必为所有风格重复所有资源。

例如,您有 3 种口味。flavor1flavor2使用相同的主题,但flavor3. 然后,您可以为公共资源定义额外的源集,例如commonA(用于风味 1、风味 2)和commonB(用于风味 3):

...
android {
    ...
    productFlavors {
        flavor1{

        }
        flavor2{

        }
        flavor3{

        }
    }

    sourceSets.flavor1{
        res.srcDirs = ['res', 'src/commonA/res']
    }
    sourceSets.flavor2{
        res.srcDirs = ['res', 'src/commonA/res']
    }
    sourceSets.flavor3{
        res.srcDirs = ['res', 'src/commonB/res']
    }
}
Run Code Online (Sandbox Code Playgroud)

您还应该创建文件夹src/commanAsrc/commonB然后将您的公共资源放入它们的res文件夹中。


a54*_*dio 6

仅供参考,以防有人正在寻找一种简单的方法来实现这一目标。

在你的清单中,将你的主题更新为这样的......

android:theme="${appTheme}"
Run Code Online (Sandbox Code Playgroud)

然后在你的 app.gradle 中做这样的事情......

productFlavors {
    flavorA{
        manifestPlaceholders = [appTheme: "@style/AppThemeA"]
    }
    flavorB{
        manifestPlaceholders = [appTheme: "@style/AppThemeB"]
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在那里使用任何你想要的风格,它们将与所选的口味相结合。


小智 1

创建包含默认值的基本样式的更好方法,然后在主源样式中,现在样式扩展它(但可能什么都不做)。然后,您可以在风味中扩展它并覆盖您需要的内容。