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

时间:2015-12-03 14:43:51

标签: android android-gradle android-theme

我是一个有多种口味的Android项目,我正在研究。

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

我想要这样做,以便某些口味基于AppCompat灯光主题,一些基于AppCompat黑暗主题。

我知道我可以通过重复我的风格中的所有<items>并在每个风格设置中将主题指向每个应用的自定义清单中的每个应用,但这看起来有点过分。

是否有一些简单的方法来设置主题

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">                
            <item name="colorPrimary">@color/primary_colour_tone1</item>
            ...lots more settings
    </style>

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

所以有些人喜欢:

    <style name="AppTheme" parent="**Theme reference here**">                
            <item name="colorPrimary">@color/primary_colour_tone1</item>
            ...lots more settings
    </style>

我尝试过使用像@ string / theme_name这样的东西但是没有用,有没有一种简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分:3)

您可以为一种或多种口味定义公共资源(也包括来源)的sourceSets,这意味着您不必为所有口味重复所有资源。

例如,你有3种口味。 flavor1flavor2使用相同的主题,但flavor3。然后,您可以为公共资源定义额外的源集,例如commonA(针对flavor1,flavor2)和commonB(针对flavor3):

...
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']
    }
}

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

仅供参考,以防有人正在寻找一种简便的方法来进行此操作。

在清单中,将您的主题更新为这样的内容...

android:theme="${appTheme}"

然后在您的app.gradle中执行以下操作...

productFlavors {
    flavorA{
        manifestPlaceholders = [appTheme: "@style/AppThemeA"]
    }
    flavorB{
        manifestPlaceholders = [appTheme: "@style/AppThemeB"]
    }
}

然后,您可以在其中使用所需的任何样式,它们将与所选的样式相关。