Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 导入的相对路径_Java_Android_White Labelling - Fatal编程技术网

Java 导入的相对路径

Java 导入的相对路径,java,android,white-labelling,Java,Android,White Labelling,我想知道java中是否有一种方法可以使用相对包路径进行导入。大概是这样的: import *.fragments.MyFragment; 如果我有一个白标应用程序,我想让主应用程序有一个“MyFragment”的定义,但需要一种产品风格来定义它,那么我会使用它 课程是完全合格的东西。即使您可以从所有包中导入名为Object的所有类,运行时也必须知道在任何给定语句中要使用哪个类。如果没有完全限定的名称(这正是import语句的目的),运行库绝对无法知道您想要哪个类。而且,如果两个类共享相同的规范

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

import *.fragments.MyFragment;
如果我有一个白标应用程序,我想让主应用程序有一个“MyFragment”的定义,但需要一种产品风格来定义它,那么我会使用它

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

完整地说,在vanilla java中,实际上可以将两个同名的类加载到同一个运行时中。但是,必须使用指向不同
jar的不同类加载器。您还可以巧妙地构建类路径,以便在同一类加载器中隐藏其他类(您将得到类路径上的第一个类)。但是android构建系统不允许您使用相同的规范名称
dex
多个类。您将得到一个
DexException
,因为过去所有的东西都被压缩到相同的
类.dex
文件中。我不知道这个限制是否在multidex世界中放宽了

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

注意,口味通常定义产品类型和
flavor!=变体
。所以你想要一个
普通的
和一个
白标签的
味道。在使用普通片段构建的普通味道中。在白标风味中,您使用不同的碎片构建。那只是两个不同的班级


除此之外,您还可以进入普通的旧依赖项注入和接口,您可以选择它们,以便将您的构建理念从flavors和gradle方便的源集概念中解放出来。

作为@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"
        }
    }
}

这会有什么帮助呢?因为否则,应用程序会忘记产品口味的变化。如果我将导入路径硬编码到应用程序的主代码中,它将继续使用该包的类版本,而不是产品风格的问题,但是
*.fragments.MyFragment
如何消除歧义?
导入对开发人员来说是一种方便。在运行时,类总是完全限定的。是的,我知道,但这有点离题了。关键是我想使用一个相对于特定产品风格的包路径,但这正是问题所在。我不想对每种产品的口味都进行更改,只想根据需要更改特定的口味。@KairisCharm通过对build.gradle进行一些更改,您可以添加一个源集,该源集在多个口味之间共享。这意味着您可以有两个版本的片段,每个版本都在各自的源集中。然后每个味道都可以声明它使用的源集。@KairisCharm我怀疑您没有正确使用味道。我正要添加这个,但不记得您是否为每个维度获得了单独的源集。我不认为你会这么做,我不确定这有助于清理局面。正如在一篇评论中指出的,您可以手动将一个新的源集添加到所需的口味中,以便多个口味共享同一个源集,从而无需将相同的类复制粘贴到多个特定于口味的集合中。