3

我想知道java中是否有一种方法可以使用相对包路径进行导入。像这样的东西:

import *.fragments.MyFragment;

如果我有一个白标应用程序,我希望主应用程序有一个“MyFragment”定义,但产品风格需要以不同方式定义它,我会使用它。

4

2 回答 2

4

不。

类是完全合格的东西。即使您可以导入例如。所有包中名为 Object 的所有类,运行时必须知道您要在任何给定语句中使用哪一个。如果没有完全限定的名称(这正是 import 语句的用途),运行时绝对无法知道您想要哪个类。而且,如果两个类共享相同的规范名称,那么它们就是同一个类。

完整地说,在 vanilla java 中,您实际上可以将两个具有相同名称的类加载到同一个运行时中。但是,您必须使用指向 different 的不同类加载器jars。您还可以巧妙地制作类路径,以便在同一个类加载器中隐藏其他类(您将获得类路径中首先出现的类)。但是 android 构建系统不会让你有dex多个具有相同规范名称的类。你会得到一个DexException,因为所有东西都被压缩到同一个classes.dex文件中。我不知道这个限制在 multidex 世界中是否已经放松。

要做你想做的事,你可以简单地利用特定于风味的源集。因此,您src/flavor1/java包含该类的一个定义,然后src/flavor2/java包含同一类的另一个定义。如果您这样做,则无法在主源集中定义该类,并且必须在每个风味的源集中单独定义该类。

请注意,风味通常定义产品的类型和flavor != variant. 所以你会想要一个normal和一个whitelabel味道。在正常风味中,您使用正常片段构建。在白标风味中,您使用不同的片段构建。那只是两个不同的类别。

除此之外,您还可以使用普通的旧依赖注入和接口,无论如何,您可以选择它们以将您的构建理念与风味和 gradle 的方便的源集概念解开。

于 2016-02-17T22:46:02.913 回答
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"
        }
    }
}
于 2016-02-17T23:55:30.907 回答