Android Bottom Navigation项目Fragment导航报错及实现需求
错误原因
你直接通过parentFragmentManager提交Fragment事务,但Bottom Navigation View Activity模板用的是Navigation Component统一管理Fragment生命周期和跳转。绕过Navigation的navigate()方法直接操作FragmentManager,会导致FragmentNavigator无法识别新添加的Fragment,触发IllegalArgumentException。
解决步骤
1. 在导航图中注册目标Fragment
打开res/navigation/nav_graph.xml,把ComboListFragment添加到导航图里,给它分配唯一ID:
<fragment android:id="@+id/comboListFragment" android:name="com.example.xxxxxx.ComboListFragment" android:label="Combo列表" />
2. 使用Navigation的navigate()方法跳转
在Compose代码里,通过rememberNavController()获取导航控制器,调用navigate()完成跳转,Navigation会自动维护返回栈,设备返回键可直接回到原Fragment。
修改后的代码:
val navController = rememberNavController() Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .padding(10.dp) .border(1.dp, Color.DarkGray, RoundedCornerShape(5.dp)) .background(Color.LightGray) .padding(10.dp) .fillMaxWidth() .clickable { // 调用Navigation的跳转方法 navController.navigate(R.id.comboListFragment) } ) { Text("跳转到Combo列表") }
如果是在Fragment类中获取导航控制器,也可以这么写:
// 在Fragment的代码块中 val navController = findNavController() // 点击事件里调用 navController.navigate(R.id.comboListFragment)
补充说明
- Navigation Component会自动处理返回栈,无需手动调用
addToBackStack,跳转后返回键默认回到上一页。 - 所有Navigation管理的Fragment跳转,必须用
navigate()方法,不能直接操作FragmentManager,否则会破坏导航状态。
内容的提问来源于stack exchange,提问作者johann
相关产品推荐
相关产品推荐

