【问题标题】:Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them in switch case statements资源 ID 在 Android Gradle 插件 5.0 版中将是非最终的,请避免在 switch case 语句中使用它们
【发布时间】:2020-08-06 19:53:52
【问题描述】:

Android Studio 现在警告这一重大变化即将到来。

Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them in switch case statements

唯一的其他选项是 if/else 吗?

【问题讨论】:

  • 也许他们希望你使用 Kotlin 的“何时”声明?不知道问题是否仍然存在...kotlinlang.org/docs/reference/control-flow.html
  • 那么什么是java解决方案? switch 只支持原始类型而不是视图等。
  • 我在一个使用 ButterKnife 的旧项目中也遇到了这个问题。错误出现在 BindView 行上。 @BindView(R.id.button_text) protected TextView buttonText;
  • 在使用 kotlin 的时候仍然存在;在字节码中是相同的语句。
  • 不,我们必须使用 if/else 阶梯语句,stackoverflow.com/questions/64335374/…

标签: android


【解决方案1】:

必须根据 Google 使用 if/else:http://tools.android.com/tips/non-constant-fields

在常规的 Android 项目中,资源 R 类中的常量声明如下: public static final int main=0x7f030004;

但是,从 ADT 14 开始,在 library 项目中,它们将被声明为: public static int main=0x7f030004;

换句话说,常量不是库项目中的final。原因很简单:当组合多个库项目时,字段的实际值(必须是唯一的)可能会发生冲突。在 ADT 14 之前,所有字段都是最终的,因此,所有库在使用时都必须将其所有资源和相关 Java 代码与主项目一起重新编译。这对性能不利,因为它使构建速度非常慢。它还阻止了不包含源代码的库项目的分发,限制了库项目的使用范围。

这些字段不再是 final 的原因是它意味着库 jar 可以编译一次并直接在其他项目中重用。除了允许分发库项目的二进制版本(在 r15 中提供)之外,这可以加快构建速度

【讨论】:

  • 这不应该是公认的答案,因为该文档信息仅适用于库项目,而 Lint 错误现在也出现在应用程序项目中。
  • 无论提到的文档说什么,两者的行为都是相同的。链接的文档也有 8 年历史。
猜你喜欢
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多