【问题标题】:Android flavors with different base themes具有不同基本主题的 Android 风格
【发布时间】:2015-12-03 14:43:50
【问题描述】:

我正在开发一个具有多种风格的 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 之类的东西,但不起作用,有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: android android-gradle-plugin android-theme


    【解决方案1】:

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

    例如,您有 3 种口味。 flavor1flavor2 使用相同的主题,但 flavor3。然后你可以为公共资源定义额外的源集,例如commonA(for flavor1,flavor2)和commonB(for 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 文件夹中。

    【讨论】:

    • 谢谢,我想这仍然意味着有两个“style.xml”文件,除了它们继承的“父”之外,它们几乎相同。我希望有一些可以更加动态的东西,以免两个文件的所有设置几乎相同。
    • 我不知道您的问题的另一种解决方案,我尝试了一些解决方法但没有成功。我已经问了一个问题,如果它得到答案,我猜你的也是。 stackoverflow.com/questions/34110745/…
    • 目前我只是将样式复制了两次,这可行但感觉不对
    【解决方案2】:

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

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

    android:theme="${appTheme}"
    

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

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

    然后,您可以在那里使用任何您想要的样式,它们将与所选的风味相关联。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 但是当你想扩展 parent="Theme.AppCompat.NoActionBar" 主题时你怎么做呢?我不能把所有东西都放在一个主题中,因为它需要扩展一些东西(浅色或深色主题)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2013-05-25
      • 2016-06-05
      • 2020-07-17
      • 2015-04-13
      • 1970-01-01
      相关资源
      最近更新 更多