当前位置: 首页 > 知识库问答 >
问题:

为什么gradle不能覆盖不同Android风格的Java类?

微生俊
2023-03-14

我有一个具有2种口味的android应用程序:-味道1-味道2

我的目录树是:

/src/main
/src/flavor1
/src/flavor2

main有默认的源集。味道1和味道2目录有自己的源集,它会自动获取。如果我将资源文件添加到味道目录中,它会从main覆盖它,并且工作正常。

但是,如果我在snorty2中添加一个java类以覆盖“main”中的另一个类(例如,一个需要在slavor2中不同的活动),它不会替换它,并且它说我的项目中有一个重复的类。我只能通过从“main”目录中删除类并将其添加到所有风格文件夹中来使其工作。

有没有一种方法可以像资源文件一样重写java类?为什么会发生这种情况?

共有1个答案

郜卓君
2023-03-14

有没有一种方法可以像资源文件一样覆盖java类?

不,Android工具团队的Xavier Ducrohet在这里简要讨论了其中的一些问题。

不过,有很多方法可以实现你想要的——一秒钟内就可以实现更多。

为什么会发生这种情况?

您的Java代码需要编译。假设您从源集中的其他类引用了一个类Foo,那么无论编译的是什么风格的Foo类都必须具有相同的公共API。如果您能够将主<code>Foo</code>完全替换为特定口味的<code>Foo</code>,则这可能不成立。这当然不是一个不可能用工具解决的问题,但当前构建工具的解决方案就是不让您这么做。

当然,对于图像等资源,这是完全不同的 - 只要存在某些版本的资源,Android就可以很好地使用它。

但是,您可以创建类的特定于变种的实现,以便在源代码集中使用。最简单的方法是简单地在每种口味中只放一个Foo,而不是在你的源代码集中提供Foo。为了获得奖励,请在源代码集中为这些实现创建一个接口,以确保特定于风格的实现符合相同的接口,并且不会导致生成错误。

 类似资料:
  • 问题内容: 我试图弄清楚为什么我无法覆盖通过隔离范围()传递给angularJS指令的值。我尝试使用以下方法覆盖的值: 但是,由于某些原因,它不起作用。 如果我将其更改为: 有用。另外,在作品上分配价值。 为什么第一种方法不起作用? 我已经创建了这个示例插件。 问题答案: 如您在此处使用的那样,需要通过插值指令从属性获取值。似乎指令首先被加载,然后值被求值。因此,在当前摘要周期中不会发生更改。如果

  • 问题内容: 我正在浏览Kathe sierra编写的SCJP 6,并遇到了有关以重写方法引发异常的解释。我真的不明白。有人可以向我解释吗? 覆盖方法不得抛出比被覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的

  • 问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创

  • 问题内容: 为什么StringBuffer的/ StringBuilder的没有覆盖,从对象的方法? 请给我建议清晰的图片,以帮助理解问题… 问题答案: 因为是可变的,所以它的主要用途是 构造 字符串。如果要比较内容,请调用并比较返回的值。 覆盖可变对象通常没有用,因为修改用作a键的对象可能会导致存储的值“丢失”。

  • 我正在寻找关于这个案例的解释:我有一个项目,它有一个dependencyManagement/dependencies部分,其中包含: myproject/pom。xml: spring cloud starter父pom定义: 这样,我的项目将获得SpringCloudStarterEureka版本1.1.0。构建快照。 我期望,如果我在myproject/pom.xml一个属性部分添加另一个版

  • 如果您看一下这个程序,在Location类中,我们分别用return false和110重写了两个方法(equals和hashcode)。我们正在创建Location类的一个实例,并在map中放置两次。当我们从equals方法返回false时,为什么要用key映射覆盖last value?