带有各种风味的Android主题模块

时间:2015-07-07 19:44:08

标签: android android-studio gradle android-productflavors

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

App1: dependencies
reusable lib1
reusable lib3
reusable lib4
theme - App1 flavor

App2: dependencies
reusable lib1
reusable lib2
reusable lib4
theme - App2 flavor

现在我更愿意,如果可重用的libs可以简单地依赖于主题而不需要知道要构建哪种风格,并且主要的应用程序项目依赖于主题可以引用该应用程序的风格(使用此答案{{3} })。原因是每个可重用模块都不能在其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,但我必须在构建每个应用程序之前不断更改它,或者为我想避免的每个lib做很多味道。有人做过这样的事吗?

tl; dr模块是否可以根据引用相同模块的应用程序构建的风格引用另一个模块的风格

2 个答案:

答案 0 :(得分:0)

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

,例如,

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 :(得分:0)

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

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

  

Intent可与startActivity一起使用,以启动ActivitybroadcastIntent将其发送给任何感兴趣的BroadcastReceiver组件,以及startService(Intent)或{{1与后台服务进行通信。

这样,您可以使用相同的应用启动多个应用,解决了必须更改每个应用的依赖关系的问题。有意为之,您只需使用相同的代码启动应用程序。

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