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

点击底部导航切换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:52:43