Android资源ID突然不是最终的,switch()'s broken

7uhlpewt  于 2023-08-01  发布在  Android
关注(0)|答案(7)|浏览(169)

序言:这个问题已经很过时了,它是在首选的Android开发环境是带有Android插件的Eclipse时编写的。
我有一段时间做了一个Java Android项目。今天,我更新了Android开发工具到谷歌的最新版本。而且项目坏了--我得到了一堆“case表达式必须是常量表达式”的编译错误信息。
结果发现R.java文件现在以不同的方式生成。以前,它会有一堆

public static final int MyID=0x12340000;

字符串
语句;现在,它看起来(在清理/重建之后)如下所示:

public static int MyID=0x12340000;


final不见了。所以我所有的资源ID上的开关(我有几个)都是错误的。发生什么事了是我吗?这有什么道理?有记录吗?我能以某种方式恢复final吗?

wa7juj8i

wa7juj8i1#

这发生在昨天,当SDK/ADT 14发布时:
从ADT 14开始,库项目中的资源常量不再是final的。这在http://tools.android.com/tips/non-constant-fields中有更详细的说明
ADT 14提供了一个快速修复程序:http://tools.android.com/recent/switchstatementconversion
引用理由:
组合多个库项目时,字段的实际值(必须是唯一的)可能会发生冲突。在ADT 14之前,所有字段都是final字段,因此,所有库都必须在主项目中重新编译它们的所有资源和相关的Java代码。这对性能不利,因为它使构建非常缓慢。它还防止分发不包含源代码的库项目,从而限制了库项目的使用范围。
字段不再是final的原因是,这意味着库jar可以编译一次,并直接在其他项目中重用。除了允许发布库项目的二进制版本(在r15中),这使得构建速度更快。

4dc9hkyq

4dc9hkyq2#

只需添加括号:

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

字符串

kokeuurv

kokeuurv3#

你可以切换到使用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);
        } 
  }

字符串

wb1gzix0

wb1gzix04#

Google建议您使用if/else条件
http://tools.android.com/tips/non-constant-fields
要自动更改它们,您可以将插入符号放在switch关键字上,然后在Windows上按Alt + Enter(在Mac上按Option + Enter)并选择将'switch'替换为'if'

x0fgdtte

x0fgdtte5#

你应该使用view binding

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

字符串

dfuffjeb

dfuffjeb6#

这是因为在新的AGP版本中,Google使所有rescours id非最终,在项目根目录下的gradle.properties文件中添加android.nonFinalResIds=false,以确保AGP生成最终res id将使您避免修改代码。

7kqas0il

7kqas0il7#

只需要在你的模块级build.gradle文件中添加这个片段:

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

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

相关问题