赞
踩
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-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
了,但是还是得提醒一下在座各位,这样修改有风险,可能某天程序报错的时候,就是你今天埋下来的大坑!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。