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

Java中BottomNavigationView的Switch语句报常量表达式错误的解决方法

解决Switch语句实现BottomNavigationView页面切换的"Constant Expression required"错误

错误原因

Android 中 R.id.xxx 在 API 21 及更早版本里并非编译时常量,而 Java 的 switch 语句要求 case 后面必须是编译期可确定的常量表达式,所以直接用 item.getItemId() 配合 R.id.xxx 写 switch 会触发这个错误。

可行解决办法

1. 改用 if-else 分支(你已经尝试的方案)

这是最直接且兼容性最好的方案,对所有 API 版本都适用,补全代码如下:

binding.bottomNavigationView.setOnItemSelectedListener(item -> {
    int id = item.getItemId();
    if (id == R.id.camera) {
        replaceFragment(new CameraFragment());
    } else if (id == R.id.translate) {
        replaceFragment(new TranslateFragment());
    } else if (id == R.id.audio) {
        replaceFragment(new AudioFragment());
    }
    return true;
});

2. 定义编译时常量映射(可选)

如果坚持想用 switch,可以先把 R.id 映射为编译时常量(仅适用于 API 21+ 项目,即 minSdkVersion ≥21):

// 在类中定义常量
private static final int CAMERA_ID = R.id.camera;
private static final int TRANSLATE_ID = R.id.translate;
private static final int AUDIO_ID = R.id.audio;

// 然后使用switch
binding.bottomNavigationView.setOnItemSelectedListener(item -> {
    switch (item.getItemId()) {
        case CAMERA_ID:
            replaceFragment(new CameraFragment());
            break;
        case TRANSLATE_ID:
            replaceFragment(new TranslateFragment());
            break;
        case AUDIO_ID:
            replaceFragment(new AudioFragment());
            break;
    }
    return true;
});

注:API 21 开始 R.id 才被定义为 final 常量,所以该方案仅适用于最低适配版本≥21的项目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:13:29