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 的报错

在这里插入图片描述

解决方案

一、 使用 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-1gradle.properties 示例如下

显然,后面有(Project Properties) 显示的是工程级别的配置文件

在这里插入图片描述

Step-2:在文件末尾增加代码 android.nonFinalResIds=false

在这里插入图片描述

Step-3:刷新 gradle,点击上方的刷新按钮

在这里插入图片描述

Step-4:发现报错已经消失,但是变成了 warning,报错信息的翻译如下,说的是 因为资源 id 不是用 final 修饰的,所以会带来编译效率的降低,不太建议使用,这个也确实是很有道理的,但是我选择无视这个风险。

Android Gradle Plugin version 8.0中,资源id默认为非final,避免在switch case语句中使用它们。(Ctrl + F1)
巡检信息:避免使用需要常量表达式的资源idAndroid Gradle Plugin的未来版本将生成带有非常量idR类,以提高增量编译的性能。

在这里插入图片描述

Step-5:加上 @SuppressLint("NonConstantResourceId") 注解消除 warning

Tips@SuppressLint("NonConstantResourceId")Android StudioIntelliJ IDEA 中的一个注解,主要用于抑制特定的 Lint(代码静态检查工具)警告。

Android 开发中,Lint 通常会建议开发者确保所有使用的资源 ID 都是常量,这样可以避免潜在的运行时错误,因为非常量资源 ID 可能会导致编译器优化失败或者在运行时找不到对应的资源。因此,当你直接从 R 类引用资源 ID 时,IDE 默认期望它是 final static 的。

然而,在某些情况下,可能由于项目需求或者特殊场景,你需要动态获取资源 ID 并进行处理,这时就可能会触发 “ResourceType” 非常量的 Lint 警告。

@SuppressLint("NonConstantResourceId") 注解的作用就是告诉 Lint 工具忽略这种特定类型的警告,允许你在代码中使用非常量资源 ID,但请注意这可能会增加潜在的运行时风险。在使用此注解前,请确保你了解其背后的风险并有充分的理由这样做。

在这里插入图片描述

好的,现在我们完全可以使用 switch 了,但是还是得提醒一下在座各位,这样修改有风险,可能某天程序报错的时候,就是你今天埋下来的大坑!!

参考文章

  1. 【已解决】switch语句报错Constant expression required
  2. constant expression required
  3. 【Java】Constant expression required
  4. Android enum Constant expression required问题解决

相关推荐

  1. Android StudioGradle问题解决思路

    2024-03-27 18:46:04       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-27 18:46:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-27 18:46:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-27 18:46:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-27 18:46:04       20 阅读

热门阅读

  1. python ch10 文件和异常

    2024-03-27 18:46:04       18 阅读
  2. node整理学习(三)

    2024-03-27 18:46:04       18 阅读
  3. 海思 Hi3403V100 简介

    2024-03-27 18:46:04       30 阅读
  4. Idea与DataGrip各版本通用破解码,无需脚本。

    2024-03-27 18:46:04       69 阅读
  5. 深入理解 LVS:配置与应用详解

    2024-03-27 18:46:04       21 阅读
  6. 单位里,永远要记住这些残忍的处事之道!

    2024-03-27 18:46:04       17 阅读
  7. Linux安装程序

    2024-03-27 18:46:04       19 阅读
  8. Linux UVC Gadget Driver开发

    2024-03-27 18:46:04       16 阅读
  9. c#委托案例

    2024-03-27 18:46:04       17 阅读
  10. SpringBoot-注解:@Async 使用

    2024-03-27 18:46:04       18 阅读
  11. springBoot实现热部署

    2024-03-27 18:46:04       15 阅读
  12. 排序问题HJ37 统计每个月兔子的总数

    2024-03-27 18:46:04       16 阅读