Android Studio中BottomNavigationView报‘constant expression required’错误求助
问题原因
Android Gradle Plugin 7.0及以上版本默认开启了**非传递性R类(Non-transitive R class)**特性,该特性会让R类中的ID字段不再是编译时常量(即不再带有static final修饰符)。而switch语句的case分支要求必须使用编译时常量,因此直接用R.id.xxx作为case条件就会触发error: constant expression required错误。
解决方案
方案1:改用if-else语句(推荐,无需修改配置)
把switch替换成if-else判断,不需要依赖常量,直接对比ID值即可,适合新手快速解决问题:
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.nav_home) { myWeb.loadUrl("https://test.net/"); return true; } else if (itemId == R.id.nav_search) { myWeb.loadUrl("https://test.net/"); return true; } else if (itemId == R.id.nav_profile) { myWeb.loadUrl("https://test.net/"); return true; } return false; } });
方案2:关闭非传递性R类特性
如果你坚持使用switch语句,可以修改项目配置让R类的ID恢复为编译时常量:
- 打开app模块下的
build.gradle(或build.gradle.kts)文件 - 在
android代码块中添加以下配置:
android { // 其他原有配置... nonTransitiveRClass = false }
- 同步gradle项目后,switch语句即可正常使用。
注意:关闭该特性会导致编译速度略有下降,因为R类会包含所有依赖库的资源ID。
内容的提问来源于stack exchange,提问作者3ARF
相关产品推荐
相关产品推荐

