在另一个片段中定义 NavHostFragment
Defining a NavHostFragment inside another fragment
我有一个片段,我在其中定义了一个 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 吗?
还是只适合 activity?
我搜索了很多,想找到可以在另一个片段中定义导航主机片段的方法,但我没有找到任何答案。
我找到了解决此异常的方法,当尝试在非 NavHostFragment 或不在 NavHostFragment 的片段中调用此方法时,findNavController() 会抛出此异常,因此我在片段中调用此方法时犯了这个错误.
所以我必须自己使用导航找到控制器 class
Navigation.findNavController(activity, R.id.my_nav_host_fragment)
这是查找片段中定义的 NavHostFragment (NavController) 的方法
我为 Fragment class 做了一个扩展函数,所以我可以使用 id
轻松找到导航控制器
fun Fragment.getFragmentNavController(@IdRes id: Int) = activity?.let {
return@let Navigation.findNavController(it, id)
}
我有一个片段,我在其中定义了一个 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 吗? 还是只适合 activity? 我搜索了很多,想找到可以在另一个片段中定义导航主机片段的方法,但我没有找到任何答案。
我找到了解决此异常的方法,当尝试在非 NavHostFragment 或不在 NavHostFragment 的片段中调用此方法时,findNavController() 会抛出此异常,因此我在片段中调用此方法时犯了这个错误.
所以我必须自己使用导航找到控制器 class
Navigation.findNavController(activity, R.id.my_nav_host_fragment)
这是查找片段中定义的 NavHostFragment (NavController) 的方法
我为 Fragment class 做了一个扩展函数,所以我可以使用 id
轻松找到导航控制器fun Fragment.getFragmentNavController(@IdRes id: Int) = activity?.let {
return@let Navigation.findNavController(it, id)
}