Jetpack Navigation嵌套NavHostFragment下Fragment内底部导航异常问题
问题原因
崩溃的直接原因是Navigation.findNavController(getActivity(), R.id.fragment_navigation_navHostFragment)从Activity的视图树中查找子NavHostFragment的ID,但子NavHostFragment属于NavigationFragment的私有视图树,在NavigationFragment的视图还未完全attach到Activity时,Activity中不存在这个ID,因此抛出非法参数异常。
解决方案
直接通过当前Fragment的子Fragment管理器获取子NavHostFragment实例,再拿到对应的NavController即可,修改后的NavigationFragment代码如下:
public class NavigationFragment extends Fragment { FragmentNavigationBinding binding; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_navigation, container, false); return binding.getRoot(); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 从当前Fragment的子FragmentManager中获取子NavHostFragment NavHostFragment navHostFragment = (NavHostFragment) getChildFragmentManager().findFragmentById(R.id.fragment_navigation_navHostFragment); NavController navController = navHostFragment.getNavController(); NavigationUI.setupWithNavController(binding.fragmentNavigationBtmNav, navController); } @Override public void onDestroyView() { super.onDestroyView(); binding = null; // 避免内存泄漏 } }
可选优化建议
- 可以将布局文件中的
<fragment>标签替换为<androidx.fragment.app.FragmentContainerView>,这是Google官方推荐的Fragment容器,能避免原生<fragment>标签存在的一些生命周期和视图查找异常问题,其他属性不需要修改。 - 确保子导航图
nav_graph_main.xml中定义的三个页面目的地ID,和bottom_navigation.xml菜单项的ID完全一致,才能实现点击菜单项自动切换页面的效果,你当前的ID匹配规则是正确的,不需要调整。
内容的提问来源于stack exchange,提问作者Gene
相关产品推荐
相关产品推荐

