android Switch/case with R.id.XXXX in android doesn‘t work 错误: 需要常量表达式解决方案

出现需要常量表达式 R.id.xxx 表达式错误的处理方法

出现的原因是因为:
使用 Android Gradle 插件 8.0.0 时,默认情况下,您的所有 R 类资源都不再声明为 final/constant(因此在 switch 语句中不起作用)。 如果您在 Android Studio 中使用 AGP 升级向导,它实际上会将此行添加到您的 gradle.properties 中,以保留旧行为:

解决方法
1.将switch 切换为 if else 表达式
2.在 gradle.properties 添加 android.nonFinalResIds=false

再看看 加没加 android.nonFinalResIds=false 的id的值有啥不一样

public static abstract final int navigation_notifications = 2131231004
public static abstract int navigation_notifications = 1000006

少了 final 关键字

### Android Studio 中 `switch` 语句中的 `case` 需要常量表达式解决方案 在 Java 或 Kotlin 编程语言中,当使用 `switch` 语句时,每个 `case` 后面的标签必须是一个编译时常量。这意味着这些值在编译期间就必须已知且不可改变。 对于像 `R.id.rb_nan` 这样的资源 ID,在运行时由 Android 构建工具生成,并不是真正的编译期常量。因此直接将其用于 `switch-case` 结构会引发错误提示:“Case expressions must be constant expressions”。 为了处理这种情况,可以考虑以下几种方法: #### 方法一:使用 `if-else` 替代 `switch` 如果目标是为了比较视图组件的 ID 是否匹配特定项,则可以直接采用更灵活的条件判断逻辑来代替 `switch`[^1]。 ```java // 使用 if-else 来替代 switch-case if (view.getId() == R.id.rb_nan) { // 处理 rb_nan 的情况 } else if (view.getId() == anotherId) { // 其他分支... } ``` 这种方法虽然牺牲了一定程度上的简洁性,但是能够有效避开由于 `R.id.*` 不是真正意义上的编译时常量所带来的限制。 #### 方法二:利用枚举类型作为中介 创建自定义枚举类并将各个控件对应的整型ID映射到不同的枚举实例上;之后再基于此枚举行 `switch` 操作即可满足语法要求的同时保持原有意图不变[^2]。 ```kotlin enum class RadioButtonEnum(val id: Int) { RB_NAN(R.id.rb_nan), ANOTHER_BUTTON(anotherButtonId); companion object { fun fromInt(id: Int): RadioButtonEnum? = values().find { it.id == id } } } val selectedRadioButton = when (RadioButtonEnum.fromInt(view.id)) { RadioButtonEnum.RB_NAN -> /* 对应操作 */ ... null -> throw IllegalArgumentException("Unknown button clicked") } ``` 以上两种方式都可以很好地解决问题并维持良好的可读性和维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值