You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中BottomNavigationView报‘constant expression required’错误求助

解决BottomNavigationView监听中switch语句的"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恢复为编译时常量:

  1. 打开app模块下的build.gradle(或build.gradle.kts)文件
  2. 在android代码块中添加以下配置:
android {
    // 其他原有配置...
    nonTransitiveRClass = false
}
  1. 同步gradle项目后,switch语句即可正常使用。

注意:关闭该特性会导致编译速度略有下降,因为R类会包含所有依赖库的资源ID。

内容的提问来源于stack exchange,提问作者3ARF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:52:33