小工具知识网

当前位置: 首页 > 行业知识 > Android 开发解决 switch 语句报错 Constant expression required 问题

行业知识

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

2026-11-07 17:56:26 来源:互联网转载

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


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

文章目录

  • `Android` 开发解决 `switch` 语句报错 `Constant expression required` 问题
    • 报错显示
    • 解决方案
      • 一、 使用 `if-else` 进行 `switch` 语句替换
      • 二、 修改 `gradle.properties` 使语句允许 `switch` 使用
      • 参考文章

        背景:当我使用新版本(2023.3.4)的 IDEA 进行 Android 开发的时候,想要给多个 button 控件设置监听器,要根据不同findViewById(button) 进行操作时,使用了 switch 语句进行分类,但是 idea 进行环境报错,constant expression required

        报错显示

        可以看到,当使用 switch 语句进行判断时,在 case 后面的语句中出现 Constant expression required 的报错

        解决方案

        一、 使用 if-else 进行 switch 语句替换

        我们可以将上述 switch 代码修改为 if-else 的,进行等价替换,消除问题。

        @Overridepublic 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) 显示的是工程级别的配置文件

        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)

        巡检信息:避免使用需要常量表达式的资源id。Android Gradle Plugin的未来版本将生成带有非常量id的R类,以提高增量编译的性能。

        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,但请注意这可能会增加潜在的运行时风险。在使用此注解前,请确保你了解其背后的风险并有充分的理由这样做。

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

        参考文章

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

上一篇:服务器内存怎么插最好看?

下一篇:服务器怎么做家用主机?