【问题标题】:Android theme module with flavors带有风味的 Android 主题模块
【发布时间】:2015-09-25 11:51:27
【问题描述】:

所以这有点有趣,我不确定如何在 android studio 中进行设置。我有几个模块,其中包含一些我在各种应用程序中使用的可重用组件,但是使用风味将某些主题注入到可重用组件中会很好。我没有为我编写的每个应用程序的每个组件创建一个新的风格,而是考虑拥有 1 个主题模块,这将对我编写的每个应用程序都有一个风格,具有配色方案......等等。这是我想要的设置方式:

App1:依赖项 可重用的lib1 可重用的 lib3 可重用的lib4 主题 - App1 风味 App2:依赖项 可重用的lib1 可重用的lib2 可重用的lib4 主题 - App2 风味

现在我希望可重用库可以简单地依赖于主题而不需要知道要构建哪种风格,并且它依赖于主题的主应用程序项目可以引用该应用程序的风格(使用这个答案https://stackoverflow.com/a/24316133/1316346) .这样做的原因是每个可重用模块的 build.gradle 依赖项中不能有单个应用程序,否则会破坏引用它们的其他应用程序。必须为我编写的每个应用程序制作每个可重用模块的风格也很乏味。有没有办法实现这样的目标?这是我尝试过的:

App1 build.gradle:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile project(path: ':Theme', configuration: 'app1Release')
    compile project(':Lib1')
    compile project(':Lib2')
    compile project(':Lib4')
}

App2 build.gradle:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile project(path: ':Theme', configuration: 'app2Release')
    compile project(':Lib1')
    compile project(':Lib3')
    compile project(':Lib4')
}

Lib1 build.gradle:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile project(path: ':Theme')
}

问题在于,一旦 Lib1 尝试访问主题中的任何内容,就会出错。事实上,它甚至不会先构建主题,它会尝试在主题之前构建 Lib1,即使 Lib1 具有依赖项(味道有点奇怪)。如果我将 Lib1 更改为:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile project(path: ':Theme', configuration: 'app1Release')
}

它适用于 app1,但我必须在构建每个应用程序之前不断更改它,或者为我想避免的每个库做很多风格。有没有人实现过这样的目标?

tl;dr 一个模块能否根据引用同一模块的应用构建的风格来引用另一个模块的风格

【问题讨论】:

  • 为什么不在应用中使用实际的主题?您需要将什么样的值传递到您的模块中?如果您在模块中使用 ?colorPrimary 之类的主题属性,则可以使用没有风格的普通主题,您还可以创建自定义值以包含到您的主题中

标签: android android-studio gradle android-productflavors


【解决方案1】:

看看Manifest Merging:http://developer.android.com/tools/building/manifest-merge.html

为了使您制作的每个应用程序的每个库都具有相同的风格,请在 XML 文件中表示 intent

Intent 可以与startActivity 一起使用以启动ActivitybroadcastIntent 以将其发送到任何感兴趣的BroadcastReceiver 组件,以及startService(Intent)bindService(Intent, ServiceConnection, int) 以与后台服务通信。

这样,您可以使用同一个应用程序启动多个应用程序,从而解决必须更改每个应用程序依赖项的问题。有了意图,您只需让应用程序自行使用相同的代码启动。

是的,一个模块引用了另一个模块的风格,基于风格可以由引用同一模块的应用程序构建。

【讨论】:

【解决方案2】:

我自己没有这样做,但是根据我对configuration injection的理解,你能不能不将所有风格都包含在 Lib1 项目中(具有相应的正确主题项目依赖项),然后在你的 Lib1 中包含配置风格App1 和 App2 的依赖关系?

例如,

dependencies {
   compile fileTree(include: ['*.jar'], dir: 'libs')
   compile 'com.android.support:appcompat-v7:22.1.1'
   compile project(path: ':Theme', configuration: 'app1Release')
   compile project(path: ':Lib1', configuration: 'app1Release')
   compile project(':Lib3')
   compile project(':Lib4')
}

【讨论】:

  • 到目前为止,这一直是我的解决方法,但要求我为我制作的每个应用程序的每个库都有一个单独的风格,我试图避免这种情况。
  • 或者您可以将您的主题与库分离,不是吗?似乎如果主题是图书馆不可或缺的一部分,那么您将固有地为每个主题拥有这些图书馆的“风味”。如果您制作的每个应用程序的主题是 1-1 的,那么您在库中也会有很多风格。
  • 主题只是一般的东西,比如'primary-color'和'button-style',它们将永远存在于主题项目中。我希望有一个解决方案,其中库只是在不知道实际构建的主题项目的哪种风格的情况下提取这些值,它只知道所有这些键都会存在。
  • 要么库需要知道主题风格 - 因此每个库都有自己的风格 - 或者他们不需要知道它,因此主题项目甚至不需要成为它们的依赖项,没有?
  • 我想要一个解决方案,其中应用程序决定主题的风格,而库仅取决于那里的内容,为每个库制作风格很麻烦,并且有点违背将主题相关的东西分开的目的开始。
猜你喜欢
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2014-08-10
  • 1970-01-01
相关资源
最近更新 更多