点击底部导航切换Fragment时遇“Constant expression required”错误求助
解决“Constant expression required”错误并实现Fragment切换
这个错误出现在switch语句中,是因为Java要求case后的表达式必须是编译时常量,而部分Android构建场景下,R.id系列资源ID不会被标记为编译时常量,导致switch无法识别。以下是两种解决方法:
方法一:用if-else替换switch(推荐)
直接修改admin_activity.java中的导航监听代码,避开switch对常量的要求:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityAdminHomeBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.bottomNavigationView.setOnItemSelectedListener(item -> { int selectedId = item.getItemId(); if (selectedId == R.id.nav_calendar) { replaceFragment(new ScheduleFragment()); } else if (selectedId == R.id.nav_settings) { replaceFragment(new SettingsFragment()); } return true; }); }
方法二:强制生成final类型资源ID
如果坚持使用switch,可以在模块的build.gradle文件中添加配置,让构建工具生成final类型的资源ID:
android { // 其他已有配置 buildFeatures { dataBinding true } // 添加该配置 android.nonFinalResIds false }
额外检查点
- 确认导入的R类是你项目的专属R类(如
com.yourprojectname.R),而非系统的android.R - 确保
replaceFragment方法已正确实现,示例如下:
private void replaceFragment(Fragment fragment) { getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, fragment) // 替换为你布局中的Fragment容器ID .commit(); }
内容的提问来源于stack exchange,提问作者Tristan Ehron Tumbaga
相关产品推荐
相关产品推荐

