如何修复MainActivity中R.id.nav需常量表达式的报错?
修复方案:解决switch中R.id提示"constant expression is required"报错
错误原因
Android Gradle Plugin 3.0及以上版本默认生成的R.id不再是编译时常量(无final修饰),而Java的switch语句要求case必须是编译时常量,因此直接在switch中使用R.id会触发该报错。
修复方法
方法1:替换为if-else条件判断(最简便直接)
把switch语句改成if-else链式判断,完全适配非常量的R.id:
// Determine which fragment to display based on the item selected int itemId = item.getItemId(); if (itemId == R.id.nav_insert_meal) { selectedFragment = new InsertMealFragment(); } else if (itemId == R.id.nav_view_meals) { selectedFragment = new ViewMealsFragment(); } else if (itemId == R.id.nav_delete_meals) { selectedFragment = new DeleteMealsFragment(); } else { selectedFragment = new HomeFragment(); }
方法2:使用映射表(适合大量选项场景)
如果有更多导航项,可使用HashMap建立ID与Fragment的映射,代码更简洁:
// 提前初始化映射表(可放在类成员变量中) private static final Map<Integer, Supplier<Fragment>> FRAGMENT_MAP = new HashMap<>(); static { FRAGMENT_MAP.put(R.id.nav_insert_meal, InsertMealFragment::new); FRAGMENT_MAP.put(R.id.nav_view_meals, ViewMealsFragment::new); FRAGMENT_MAP.put(R.id.nav_delete_meals, DeleteMealsFragment::new); } // 调用逻辑 int itemId = item.getItemId(); selectedFragment = FRAGMENT_MAP.getOrDefault(itemId, HomeFragment::new).get();
方法3:强制生成常量R.id(不推荐)
若坚持使用switch,可在build.gradle中配置让R类生成final常量,但该方法仅兼容旧版Gradle插件,且可能影响增量编译效率:
android { ... defaultConfig { ... // 仅适用于Android Gradle Plugin 3.0以下,高版本可能失效 javaCompileOptions { annotationProcessorOptions { arguments = [android.injected.build.model.only: "true"] } } } }
内容的提问来源于stack exchange,提问作者Skylar North
相关产品推荐
相关产品推荐

