我有这个带有导航组件的选项卡式 UI 和处理选项卡的 BottomNavigationView
。
我的用例涉及这些选项卡 fragment 之一,以拥有自己的 BottomNavigationView
。
我不认为 nested navigation graphs对我有用,因为我需要有一个内部 NavHostFragment
和第二个 BottomNavigationView
。
所以我在我希望托管我的内部导航图的 fragment 中。它包含一个像这样的 fragment 。
<androidx.fragment.app.FragmentContainerView
android:id="@+id/inner_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
我需要一种方法来获取上述 fragment 的导航 Controller 。
通常,当您在 Activity 中时,您会使用您为 fragment 提供的 id 从 supportFragmentManager
调用 findFragmentById
。
val navHostFragment = supportFragmentManager.findFragmentById(R.id.outer_nav_host) as NavHostFragment
所以我尝试从我的内部 fragment 中调用 Activity 对象
requireActivity().supportFragmentManager.findFragmentById(R.id.inner_host_fragment)
但是 findFragmentById
返回 null。
最佳答案
尝试从supportFragmentManager
获取NavHostFragment
,然后再获取navController
。
val navHostFragment =
requireActivity().supportFragmentManager.primaryNavigationFragment as NavHostFragment
val navController = navHostFragment.navController
感谢@ianhanniballake,您需要使用 childFragmentManager
,因为您当前的 fragment 是 fragment 的子 fragment 。
所以尝试改用:
val navHostFragment =
childFragmentManager.primaryNavigationFragment as NavHostFragment
val navController = navHostFragment.navController
更新:
throws this java.lang.NullPointerException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment
因此,来自评论的解决方案:
val navHostFragment = childFragmentManager.findFragmentById(R.id.nav_host_fragment)
as NavHostFragment
并将 nav_host_fragment
替换为内部 NavHostFragment 的 id。
关于android - 导航组件 : NavHostFragment inside a fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67012847/