如何解决“资源 ID 在 Android Gradle 插件版本 5.0 中将是非最终的,避免在 switch case 语句中使用它们”警告?

Cha*_*kar 77 android warnings

 @Override
public void onClick(View v) {
    switch (v.getId())
    {
        case R.id.legalInformationLL:
            startActivity(new Intent(AboutActivity.this, LegalInformation.class));
            break;
        case R.id.backIB:
            finish();
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于此代码“资源 ID 在 Android Gradle 插件版本 5.0 中将是非最终的,请避免在 switch case 语句中使用它们”警告出现。可能的解决方案是什么?如果我将此代码更改为:

 @Override
public void onClick(View v) {
    int id = v.getId();
    if (id == R.id.legalInformationLL) {
        startActivity(new Intent(AboutActivity.this, LegalInformation.class));
    } else if (id == R.id.backIB) {
        finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

警告消失;但与 if 语句相比,switch 语句的性能更好。那么有什么可能的解决方案可以更快地有效工作呢?

Per*_*abs 77

出现问题是因为 ADT 14 资源标识符不再是最终的。

请参阅下一个链接,其中 Google 声明使用“if/else”条件作为替代:

http://tools.android.com/tips/non-constant-fields

话虽如此。在性能方面,“switch”语句的性能可能比“if/else”条件更好。

但是,就您而言,您不会获得或失去性能或效率。

对于可能需要高效率的更具体的边缘情况,例如渲染循环或注重效率的算法,必须考虑“switch”语句可能提供的性能类型。

对于您的用例,使用“if/else”条件是一个很好的解决方案,没有效率问题。

  • 我在一个 switch 语句中有 20 多个案例。我今天升级到 Android Studio 4.1 后才收到此 lint 警告。然而,这显然已经8岁多了? (51认同)
  • 据我了解,ADT 14 停止使用 Final 标识符,但是,当 Google 切换到 Android Studio 时,Gradle 插件又重新使用 Final 标识符,但在 Gradle 插件 5 中,他们计划再次将其更改为非 Final。这意味着 Java switch 语句将在 Gradle 5 中中断,这就是新的 lint 警告的原因。 (9认同)
  • 长期以来,Google 说服开发人员使用 switch case 而不是 if!现在它突然建议反之亦然。这对我来说很有趣。 (9认同)
  • 要自动更改它们,您可以将插入符号放在 switch 关键字上,然后在 Windows 上按 Alt + Enter(在 Mac 上按 Option + Enter),然后选择将“switch”替换为“if” (7认同)
  • @Chaitanya Karmarkar Google 可以自行决定在每个 Android Studio 版本中定义新的 lint 警告,即使在这种情况下,这是一个已经存在多年的问题:https://issuetracker.google.com/issues/159878591 #评论3 (4认同)
  • 如果这是关于 ADT 14 的旧错误,为什么该错误提到 Gradle Plugin 5? (4认同)
  • 大家好,我是 Android 开发新手。我有个问题。如果它不再是最终的,是否可以将资源 ID 存储在变量中,然后在应用程序生命周期的某个时刻,该变量将再次用于引用资源? (2认同)
  • 对kotlin代码有影响吗?我们还可以使用when{..}吗 (2认同)