NavigationComponent:片段内的 NavHostFragment

Vah*_*hid 5 android android-fragments kotlin android-architecture-navigation

我有这个选项卡式 UI,带有导航组件和BottomNavigationView处理选项卡的组件。我的用例涉及这些选项卡片段之一,以拥有BottomNavigationView自己的选项卡片段。

我认为嵌套导航图对我不起作用,因为我需要有一个 insideNavHostFragment和第二个BottomNavigationView.

所以我在我希望托管内部导航图的片段中。它包含这样的片段。

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/inner_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
Run Code Online (Sandbox Code Playgroud)

我需要一种方法来获取上述片段的导航控制器。

通常,当您在进行活动时,您会使用findFragmentByIdsupportFragmentManager为片段提供的 id 来调用 。

val navHostFragment = supportFragmentManager.findFragmentById(R.id.outer_nav_host) as NavHostFragment
Run Code Online (Sandbox Code Playgroud)

所以我尝试从我的内部片段中的活动对象上调用它

requireActivity().supportFragmentManager.findFragmentById(R.id.inner_host_fragment)
Run Code Online (Sandbox Code Playgroud)

findFragmentById返回null。

Zai*_*ain 9

NavHostFragment尝试从 中获取supportFragmentManager,然后再获取navController

val navHostFragment =
        requireActivity().supportFragmentManager.primaryNavigationFragment as NavHostFragment
val navController = navHostFragment.navController
Run Code Online (Sandbox Code Playgroud)

感谢@ianhanniballake,您需要使用 ,childFragmentManager因为您当前的片段是片段的子片段。

所以尝试改用:

val navHostFragment =
    childFragmentManager.primaryNavigationFragment as NavHostFragment
val navController = navHostFragment.navController
Run Code Online (Sandbox Code Playgroud)

更新:

抛出此 java.lang.NullPointerException: null 无法转换为非 null 类型 androidx.navigation.fragment.NavHostFragment

因此,解决方案来自评论:

val navHostFragment = childFragmentManager.findFragmentById(R.id.nav_host_fragment) 
                       as NavHostFragment 
Run Code Online (Sandbox Code Playgroud)

并替换nav_host_fragment 为内部 NavHostFragment 的 id。

  • 通过“&lt;fragment&gt;”标签膨胀片段意味着它是“childFragmentManager”的一部分,而不是 Activity 的 FragmentManager 的一部分,因此到达“supportFragmentManager”永远不是正确的方法。 (2认同)