尚未崩坏 发表于 2024-6-10 19:51:03

Android 开辟解决 switch 语句报错 Constant expression required 问题

title:Android 开辟解决 switch 语句报错 Constant expression required 问题
Android 开辟解决 switch 语句报错 Constant expression required 问题



   背景:当我利用新版本(2023.3.4)的 IDEA 举行 Android 开辟的时候,想要给多个 button 控件设置监听器,要根据差别findViewById(button) 举行操作时,利用了 switch 语句举行分类,但是 idea 举行情况报错,constant expression required
报错体现

可以看到,当利用 switch 语句举行判断时,在 case 后面的语句中出现 Constant expression required 的报错
https://img-blog.csdnimg.cn/direct/63b78d08f5874992baf00a50ce018bb7.png#pic_center
解决方案

一、 利用 if-else 举行 switch 语句替换

我们可以将上述 switch 代码修改为 if-else 的,举行等价替换,消除问题。
@Override
public void onClick(View v) {
    int viewId = v.getId();

    if (viewId == R.id.button_1) {
      Toast.makeText(MainActivity.this, "您好已经连接上了1", Toast.LENGTH_SHORT).show();
    } else if (viewId == R.id.button_2) {
      Toast.makeText(MainActivity.this, "您好已经连接上了2", Toast.LENGTH_SHORT).show();
    } else if (viewId == R.id.button_3) {
      Toast.makeText(MainActivity.this, "您好已经连接上了3", Toast.LENGTH_SHORT).show();
    }
}
二、 修改 gradle.properties 使语句允许 switch 利用

如果实在是需要利用 switch 语句举行规范化,可以找到项目级别文件 gradle.properties
Step-1: gradle.properties 示比方下
显然,后面有(Project Properties) 体现的是工程级别的配置文件
https://img-blog.csdnimg.cn/direct/78c9b0069505419fa12d88298cf4d184.png#pic_center
Step-2:在文件末尾增加代码 android.nonFinalResIds=false
https://img-blog.csdnimg.cn/direct/853437dc80884020a98fb046b04a06e7.png#pic_center
Step-3:刷新 gradle,点击上方的刷新按钮
https://img-blog.csdnimg.cn/direct/ff2ce2c2734d4706bdb219c90261362d.png#pic_center
Step-4:发现报错已经消散,但是变成了 warning,报错信息的翻译如下,说的是 因为资源 id 不是用 final 修饰的,以是会带来编译服从的降低,不太建议利用,这个也确实是很有原理的,但是我选择无视这个风险。
   在Android Gradle Plugin version 8.0中,资源id默认为非final,避免在switch case语句中利用它们。(Ctrl + F1)
巡检信息:避免利用需要常量表达式的资源id。Android Gradle Plugin的未来版本将生成带有非常量id的R类,以提高增量编译的性能。
https://img-blog.csdnimg.cn/direct/8f04426067404022a40afd7e030182c6.png#pic_center
Step-5:加上 @SuppressLint("NonConstantResourceId") 注解消除 warning
   Tips:@SuppressLint("NonConstantResourceId") 是 Android Studio 或 IntelliJ IDEA 中的一个注解,紧张用于克制特定的 Lint(代码静态检查工具)警告。
在 Android 开辟中,Lint 通常会建议开辟者确保全部利用的资源 ID 都是常量,如许可以避免潜在的运行时错误,因为非常量资源 ID 可能会导致编译器优化失败大概在运行时找不到对应的资源。因此,当你直接从 R类引用资源 ID 时,IDE 默认期望它是 final static 的。
然而,在某些情况下,可能由于项目需求大概特别场景,你需要动态获取资源 ID 并举行处置惩罚,这时就可能会触发 “ResourceType” 非常量的 Lint 警告。
@SuppressLint("NonConstantResourceId") 注解的作用就是告诉 Lint 工具忽略这种特定类型的警告,允许你在代码中利用非常量资源 ID,但请留意这可能会增加潜在的运行时风险。在利用此注解前,请确保你相识其背后的风险并有充分的理由如许做。
https://img-blog.csdnimg.cn/direct/c359099d75734ff7b880617270fbcb31.png#pic_center
好的,现在我们完全可以利用 switch 了,但是还是得提示一下在座各位,如许修改有风险,可能某天步伐报错的时候,就是你本日埋下来的大坑!!
参考文章


[*]【已解决】switch语句报错Constant expression required
[*]constant expression required
[*]【Java】Constant expression required
[*]Android enum Constant expression required问题解决

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Android 开辟解决 switch 语句报错 Constant expression required 问题