不同的android风格的通用代码
我正在构build4种不同风格的Android应用程序。
我有一个Customization.java
类,其中3个是相同的,1个是不同的。
由于我不能在主文件夹和flavor文件夹中放置相同的类,所以我现在必须为这三种口味保持3个完全相同的类的副本。
有没有什么办法可以保留这个课程的两个版本?
我到目前为止所考虑的事情是:
- 我看了一下味道的大小,但是事实certificate它们不适用于这种情况。
- 只保留一个文件中的一个风格,并通过我的构build脚本进行复制。
我想知道是否有更清洁的东西。
我想将CommonsWare的评论转换为答案。 然后我会解释最终的目录设置应该如何。 我希望这可以帮助人们通过search来绊倒这个问题。
那么,你可以覆盖味道的资源。 因此,在
main/res/layout/
有一个共同的yourFlavorHere/res/layout/
在你的yourFlavorHere/res/layout/
特定的yourFlavorHere/res/layout/
。
因此,如果Customization
活动的布局文件被称为activity_customization.xml
,那么您将在src/main/res/layout
目录下的三种风格之间共享它的公共副本,并将修改过的布局xml放置在flavorFour
所使用的位置其相应的源设置目录src/flavorFour/res/layout
。
这样做的方式是,由于风味一到三(不同于风味四)没有提供他们自己的版本的activity_customization.xml
,他们将inheritance来自main
源集的版本。
这是Java类的活动变得棘手。 另一种可能性是将具有相同活动实现的风味configuration为从两个源目录中提取:特定于风味的风味以及与普通类实现共同的风味。
与资源不同,Java代码文件不会合并或覆盖。 所以,你不能在main
和任何flavortypes的源文件集中都有相同的完全限定类名的Java文件。 如果你这样做,你会收到重复的类错误 。
要解决此问题,最简单的解决scheme是将Customization
活动移出main
和每个风味源集。 这是有效的,因为风味目录是相互排斥的(相互之间,而不是main
),从而避免冲突。
但是这意味着四种口味中有三种具有活动的副本 – 维护噩梦 – 仅仅因为其中一种口味需要对其进行一些改变。 为了解决这个问题,我们可以引入另一个源代码目录,只保留三种风格之间共享的通用代码文件。
所以, build.gradle
脚本看起来像
android { ... productFlavors { flavorOne { ... } flavorTwo { ... } flavorThree { ... } flavorFour { ... } } sourceSets { flavorOne.java.srcDir 'src/common/java' flavorTwo.java.srcDir 'src/common/java' flavorThree.java.srcDir 'src/common/java' } }
注意使用java.srcDir
(而不是srcDirs
), 它将另一个Java源代码目录添加到已经存在的默认src/flavorX/java
。
现在我们所需要做的就是放弃src/common/java
的通用Customization
活动文件,使其可用于一到三种口味。 flavorFour
所需要的修改版本将在src/flavorFour/java
下设置它自己的源代码。
所以,最终的项目结构看起来就像
+ App // module |- src |- common // shared srcDir |- java |- path/to/pkg |- CustomizationActivity.java // inherited by flavors 1, 2, 3 + flavorOne + flavorTwo + flavorThree + flavorFour |- java |- path/to/pkg |- CustomizationActivity.java // per-flavor activity class |- res |- layout |- activity_customization.xml // overrides src/main/res/layout |- main + java |- res |- layout |- activity_customization.xml // inherited by flavors 1, 2, 3