android - 在另一个片段中定义 NavHostFragment
问题描述
我有一个片段,我在其中定义了一个 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 吗?还是只适合活动? 我进行了很多搜索以找到我可以在另一个片段中定义一个导航主机片段,但我没有找到任何答案。
解决方案
我找到了解决此异常的方法,当尝试在不是 NavHostFragment 或不在 NavHostFragment 的片段中调用此方法时,findNavController() 会引发此异常,因此我在片段中调用此方法犯了这个错误。
所以我必须自己使用导航类找到控制器
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)
}
推荐阅读
- android - 缩放 CalendarView 但适合边界
- javascript - 我们如何比较每个元素数组并根据值显示元素
- c++ - 使用 arm-fsl-linux-gnueabi-gcc 编译:int64_t 为 32 位长
- javascript - 未在 netuno 中发送正确的标头
- ssis - SSIS For Loop 不会跳出循环
- .net-core - 在没有 OpenXmlPowerTools 的 .NET Core 中将 Doc 转换为 HTML
- laravel - 在 Laravel 6 中,如何在没有数据库的情况下定义自定义菜单?
- c# - MongoDB C# 驱动程序:枚举上的 LINQ 过滤将枚举序列化为 int
- r - 按下闪亮仪表板中的切换按钮时完全隐藏侧边栏
- git - 带有两个命令的 Git 别名不起作用,但另一个命令正在工作