Android 资源 ID 突然不是最终的,switch() 损坏了

问题描述 投票:0回答:7

前言:这个问题已经过时了,它是在首选 Android 开发环境是带有 Android 插件的 Eclipse 时编写的。


我有一段时间有一个 Java Android 项目。今天,我将 Android 开发工具更新到了 Google 的最新版本。项目失败了 - 我收到一堆“case 表达式必须是常量表达式”编译错误消息。

事实证明,R.java 文件现在的生成方式有所不同。以前,它会有一堆

public static final int MyID=0x12340000;

声明;现在,它看起来(清理/重建后)像这样:

public static int MyID=0x12340000;

final
消失了。因此,我拥有的(我有一些)资源 ID 上的所有开关都是错误的。请问发生什么事了?只有我吗?这里面的道理是什么?它在任何地方都有记录吗?我能以某种方式把
final
带回来吗?

android eclipse compiler-errors
7个回答
43
投票

这发生在昨天,当 SDK/ADT 14 发布时:

从 ADT 14 开始,库项目中的资源常量不再是 最终的。 http://tools.android.com/tips/non-constant-fields

对此进行了更详细的解释

ADT 14 提供了快速修复:http://tools.android.com/recent/switchstatementconversion

引用理由:

当多个库项目合并时,实际值 字段(必须是唯一的)可能会发生冲突。 ADT 14 之前,所有字段 是最终的,因此所有图书馆都必须拥有他们所有的 资源和相关的 Java 代码与 main 一起重新编译 每当使用它们时都会进行项目。这对性能不利,因为 它使构建速度非常慢。它还阻止了分发库 不包含源代码的项目,限制了使用范围 图书馆项目。

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


13
投票

只需添加括号:

switch (view.getId()) {
    case (R.id.view1):
        break;
    case (R.id.view2):
        break;
}

13
投票

您可以切换到使用 If/Else 语句,警告将会消失。

样品:

    @Override
    public void onClick(final View v) {
        //finds which button was pressed
        final int buttonView = v.getId();
        String current = fromEditText.getText().toString();
        if (buttonView == R.id.bA) {
            current += getString(R.string.a);
        } 
  }

6
投票

Google 建议您使用 if/else 条件

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

要自动更改它们,您可以将插入符号放在

switch
关键字上,然后在 Windows 上按 Alt + Enter(在 Mac 上按 Option + Enter),然后选择 将“switch”替换为“if”


4
投票

这是因为在新的 AGP 版本中,Google 使所有资源 ID 都不是最终的,请在项目根目录下的

android.nonFinalResIds=false
文件中添加
gradle.properties
,以确保 AGP 生成最终资源 ID 将使您避免修改代码.


1
投票

您应该使用视图绑定

android {
    ...
    viewBinding {
        enabled = true
    }
}

-1
投票

只需将这段代码添加到您的模块级

build.gradle
文件中:

android {
    ...
    lintOptions {
        disable 'NonConstantResourceId'
    }
}

更多: https://developer.android.com/studio/write/lint#gradle

© www.soinside.com 2019 - 2024. All rights reserved.