我想知道java中是否有办法使用相对包路径进行导入。像这样:
import *.fragments.MyFragment;
我会在我有一个whitelabel应用程序的情况下使用它,我希望主应用程序有一个定义" MyFragment,"但是产品风味需要以不同的方式定义它。
答案 0 :(得分:3)
没有
类是完全合格的东西。即使你可以导入例如。从所有包中命名为Object的所有类,运行时必须知道要在任何给定语句中使用哪一个。如果没有完全限定的名称(这正是import语句的用途),运行时绝对没有办法知道你想要哪个类。而且,如果两个类共享相同的规范名称,那么它们就是同一个类。
要完成,在vanilla java中,您实际上可以将两个具有相同名称的类加载到同一个运行时中。但是,您必须使用指向不同jars
的不同类加载器。您还可以巧妙地创建类路径,以便在同一个类加载器中隐藏其他类(您将获得类路径中首先出现的类)。但是android构建系统不会让你dex
多个具有相同规范名称的类。您将获得DexException
,因为过去所有内容都被压缩到相同的classes.dex
文件中。我不知道这种限制是否在multidex世界中消失了。
要做你想做的事,你可以简单地使用特定于风味的源集。所以你有src/flavor1/java
包含一个类的定义,然后src/flavor2/java
包含同一个类的另一个定义。如果这样做,则无法在主源集中定义类,并且必须在每个flavor的源集中独立定义。
请注意,口味通常定义产品类型和flavor != variant
。所以你想要normal
和whitelabel
的味道。在您使用正常片段构建的正常风味中。在白色标签的味道,你建立了不同的fragement。这只是两个不同的类别。
除此之外,您还可以选择普通的依赖注入和接口,无论如何,您可以选择从开发和gradle方便的源集概念中解开构建原则。
答案 1 :(得分:0)
作为@ dcow答案的延伸 - 您可以在尺寸上组合口味。因此,如果您想要4种口味,例如只有两种视图变体 - 添加两种口味,将它们设置为一个维度,将初始口味设置为另一个。在此之后构建您需要的任何组合。
android {
...
flavorDimensions "appversion", "appserver"
productFlavors {
free {
applicationId = "com.myapp.free"
dimension "appversion"
}
paid {
applicationId = "com.myapp.paid"
dimension "appversion"
}
server1{
dimension "appserver"
}
server2{
dimension "appserver"
}
}
}