在另一个片段中定义NavHostFragment

9

我有一个片段,在其中我定义了一个NavHostFragment,就像这样:

<fragment
        android:id="@+id/shipping_host_nav"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/shipping_nav_graph"
        app:defaultNavHost="true"/>

在尝试在片段中调用findNavController方法时,它引发了一个非法状态异常,并且指出我的视图组没有一个NavController。

    java.lang.IllegalStateException: View androidx.core.widget.NestedScrollView{1dd5506 VFED..... ......I. 0,0-0,0} does not have a NavController set

我的问题是:我能在另一个fragment中定义NavHostFragment吗?还是只适用于activity?
我搜索了很多,想知道是否能在另一个fragment中定义NavHostFragment,但我没有找到任何答案。

当我试图理解为什么会抛出异常时,我发现了这个问题:
  • 如果给定的Fragment与{@link NavHost}不对应或不在NavHost中,则抛出IllegalStateException异常。
- Shalan93
另外,我发现这个导航组件仅限于单个Activity,这是否意味着导航组件的Nav Host只能与Activity一起使用? - Shalan93
1个回答

10

我已经找到了解决这个异常的方法。当尝试在不属于NavHostFragment或不在NavHostFragment内部的片段中调用此方法时,findNavController()将抛出此异常。所以我犯了一个错误,是在我的片段中调用了这个方法。
因此,我必须使用Navigation类自己查找控制器。

Navigation.findNavController(activity, R.id.my_nav_host_fragment)

以下是如何在 Fragment 中找到定义的 NavHostFragment(NavController)的方法

我创建了一个 Fragment 类的扩展函数,因此可以轻松地使用 ID 找到导航控制器

fun Fragment.getFragmentNavController(@IdRes id: Int) = activity?.let {
    return@let Navigation.findNavController(it, id)
}

1
如果您正在使用 navigation-ktx,则只需调用 activity?.findNavController(id) 即可,无需为此创建扩展函数。 - Max
我在dev.toStackOverflow上看到了你的帖子。我已经尝试了各种不同的方法来解决这个问题,但我的应用程序仍然崩溃。如果你能对我面临的问题提供一些指导,我会非常感激:https://dev59.com/sbroa4cB1Zd3GeqPdhlq - Aliton Oliveira
你能分享完整的实现吗?我卡在同样的地方了。 - AndroidGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接