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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:30:03