返回

在 Jetpack Navigation 中修复 `IllegalArgumentException`:一个完整指南

Android

在 Jetpack Navigation 中解决 IllegalArgumentException

问题

在使用 Jetpack Navigation 进行全局导航时,您可能会遇到 IllegalArgumentException 异常。此异常表明导航操作或目标无法从当前目标找到。具体错误消息可能类似于:

Navigation action/destination com.myexample:id/action\_global\_3 cannot be found from the current destination Destination(com.myexample:id/AFragment)

根本原因

此异常通常是由以下原因引起的:

  • 目标片段尚未在导航图中定义。
  • 从当前片段引用的导航操作无效或不存在。

解决方法

要解决此异常,请确保:

  1. 目标片段已定义: 在导航图中添加指向目标片段的声明。

  2. 导航操作有效: 检查导航操作的 ID 是否正确,并且导航操作在导航图中已定义。

  3. 使用全局操作: 确保从当前片段导航到目标片段时,使用的是全局导航操作,而不是普通导航操作。

其他注意事项

  • 检查导航图是否已正确配置并已加载到 Activity 中。
  • 确保片段类已从 FragmentFragmentActivity 继承。
  • 使用 Navigation Architecture Component 版本 2.3.0 或更高版本以获得更好的错误处理和导航体验。

结论

通过解决上述问题,您可以修复 IllegalArgumentException 异常并顺利进行全局导航。遵循这些步骤可帮助您创建健壮且易于维护的 Jetpack Navigation 应用程序。

常见问题解答

1. 如何添加目标片段?

在导航图的 <fragment> 标签中添加目标片段的声明,如下所示:

<fragment
    android:id="@+id/BFragment"
    android:name="com.myexample.BFragment">
</fragment>

2. 如何创建导航操作?

在导航图的 <action> 标签中定义导航操作,如下所示:

<action
    android:id="@+id/action_global_3"
    app:destination="@id/BFragment" />

3. 如何使用全局导航操作?

使用 navigate() 方法并传入全局操作的 ID,如下所示:

findNavController(this).navigate(R.id.action_global_3)

4. 如何在导航图之间导航?

在导航图的 <include> 标签中包含其他导航图,如下所示:

<include
    android:id="@+id/first"
    app:graph="@navigation/first_nav_graph">
</include>

5. 如何处理 IllegalArgumentException 异常?

在尝试进行导航操作之前,使用 canNavigate() 方法检查目标是否可导航,如下所示:

if (findNavController(this).canNavigate(R.id.action_global_3)) {
    findNavController(this).navigate(R.id.action_global_3)
}