向Fragment添加底部导航时NavHostFragment返回null的问题
核心崩溃原因
在Fragment的onCreateView阶段,布局内的子Fragment(即你添加的NavHostFragment)还未完成初始化与绑定,此时直接调用findFragmentById会返回null,触发NullPointerException。
排查与解决步骤
使用正确的时机与FragmentManager获取NavHostFragment
放弃在onCreateView中获取,转移到onViewCreated方法中执行——这个生命周期方法会在当前Fragment的视图完全创建完成后触发,此时子Fragment已经完成初始化。同时,必须使用当前Fragment的
getChildFragmentManager()而非Activity的getSupportFragmentManager(),因为NavHostFragment是当前Fragment的子Fragment,不属于Activity的Fragment栈。示例代码(Kotlin):
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val navHostFragment = childFragmentManager.findFragmentById(R.id.your_nav_host_id) as NavHostFragment val navController = navHostFragment.navController val bottomNav = view.findViewById<BottomNavigationView>(R.id.your_bottom_nav_id) bottomNav.setupWithNavController(navController) }示例代码(Java):
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); NavHostFragment navHostFragment = (NavHostFragment) getChildFragmentManager().findFragmentById(R.id.your_nav_host_id); assert navHostFragment != null; NavController navController = navHostFragment.getNavController(); BottomNavigationView bottomNav = view.findViewById(R.id.your_bottom_nav_id); NavigationUI.setupWithNavController(bottomNav, navController); }检查布局中FragmentContainerView的ID匹配
确认布局文件中FragmentContainerView的android:id与代码中findFragmentById传入的ID完全一致,拼写错误是常见的触发原因。布局示例:
<androidx.fragment.app.FragmentContainerView android:id="@+id/your_nav_host_id" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:navGraph="@navigation/your_nav_graph" />二次确认导航图与BottomNavigationView的ID一致性
确保BottomNavigationView菜单项的android:id与导航图中对应目的地的android:id完全相同,否则即使NavHostFragment获取成功,底部导航也无法正常工作。
内容的提问来源于stack exchange,提问作者The Only Smart Boy

