在另一个片段内定义NavHostFragment

问题描述 投票:0回答:1

我有一个片段,我在其中定义了一个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

所以我的问题是:我可以在另一个片段内定义NavHostFragment吗?或仅适合活动?我进行了很多搜索,可以在另一个片段中定义导航主机片段,但没有找到任何答案。

android android-navigation android-architecture-navigation android-navigation-graph
1个回答
3
投票

我已经找到了解决此异常的方法,当尝试在不是NavHostFragment的片段或不在NavHostFragment的片段中调用此方法时,findNavController()会引发此异常,因此我在片段中调用此方法而犯了此错误。所以我必须使用Navigation class

自己找到控制器
Navigation.findNavController(activity, R.id.my_nav_host_fragment)

这是查找片段中定义的NavHostFragment(NavController)的方法

我为Fragment类创建了扩展功能,因此可以轻松地使用id找到导航控制器

fun Fragment.getFragmentNavController(@IdRes id: Int) = activity?.let {
    return@let Navigation.findNavController(it, id)
}
© www.soinside.com 2019 - 2024. All rights reserved.