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问题解决
  • 29
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值