Java中BottomNavigationView的Switch语句报常量表达式错误的解决方法
错误原因
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
相关产品推荐
相关产品推荐

