android - 导航组件 : NavHostFragment inside a fragment

标签 android kotlin android-fragments android-architecture-navigation

我有这个带有导航组件的选项卡式 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/

相关文章:

android - 不是从 Activity 启动 AlertDialog

java - 如何在 onActivityResult 中了解相机 Intent 后的照片分辨率

javascript - 如何在 Kotlin 中使用名为 "val()"的函数?/扩展外部 JS 类

android - 如何在Kotlin中将list <String>转换为带有前缀和后缀的字符串

java - 使用谷歌地图的 Android 编程错误 "No view found for id for fragment "

安卓:m​​yLocationOverlay.runOnFirstFix 太慢

java - Android - 检查数据库中是否存在行

android - 获取 Kotlin 中当前函数的名称

java - 使用 Otto 时订户不会被解雇

android setText 使我的应用程序崩溃