不同的android风格的通用代码

我正在构build4种不同风格的Android应用程序。

我有一个Customization.java类,其中3个是相同的,1个是不同的。

由于我不能在主文件夹和flavor文件夹中放置相同的类,所以我现在必须为这三种口味保持3个完全相同的类的副本。

有没有什么办法可以保留这个课程的两个版本?

我到目前为止所考虑的事情是:

  1. 我看了一下味道的大小,但是事实certificate它们不适用于这种情况。
  2. 只保留一个文件中的一个风格,并通过我的构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