无法从当前目的地找到导航action/destination

Navigation action/destination cannot be found from the current destination

在我的应用程序中,我有 fragment_1、fragment_2 和 activity_2。所以我的主导航有这 2 个片段。我可以从片段 1 导航到片段 2,从片段 2 导航到 activity 2。当我从片段 2 导航到 aitivity 2 时,我必须弹出这个片段。

这是我的导航文件代码。

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_navigation"
app:startDestination="@id/firstFragment">

<fragment
    android:id="@+id/firstFragment"
    android:name="com.example.navcomponentbug.FirstFragment"
    android:label="fragment_first"
    tools:layout="@layout/fragment_first">

    <action
        android:id="@+id/action_firstFragment_to_secondFragment"
        app:destination="@id/secondFragment" />

</fragment>

<fragment
    android:id="@+id/secondFragment"
    android:name="com.example.navcomponentbug.SecondFragment"
    android:label="fragment_second"
    tools:layout="@layout/fragment_second">

    <action
        android:id="@+id/action_secondFragment_to_secondActivity"
        app:destination="@id/secondActivity"
        app:popUpTo="@id/firstFragment"
        app:popUpToInclusive="true"/>

</fragment>

<activity
    android:id="@+id/secondActivity"
    android:name="com.example.navcomponentbug.SecondActivity"
    android:label="activity_second"
    tools:layout="@layout/activity_second" />

</navigation>

很简单吧? 所以这是第一个片段中的导航:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val btn: Button = view.findViewById(R.id.btn_navigate_to_second_fragment)
    btn.setOnClickListener {
        findNavController().navigate(R.id.action_firstFragment_to_secondFragment)
    }
}

第二个片段的代码相同,它导航到 activity,只是操作不同(不想粘贴相同的代码)。

还有我的 activity 2 的代码:

binding.btnNavigateToFirstFragment.setOnClickListener {
        finish()
}

似乎一切都很好,但不是。当我从 activity 2 导航回第一个片段,并再次单击按钮导航到第二个片段时,出现此错误

java.lang.IllegalArgumentException: Navigation action/destination com.example.navcomponentbug:id/action_firstFragment_to_secondFragment cannot be found from the current destination NavGraph(com.example.navcomponentbug:id/main_navigation) startDestination={Destination(com.example.navcomponentbug:id/firstFragment) label=fragment_first class=com.example.navcomponentbug.FirstFragment}

那么为什么会这样呢?谢谢。

我的项目中也有完全相同的异常(但原因不一定相同)。 它发生在我身上是因为(不知不觉中)我快速点击了两次按钮(异常的错误恰好是第二次点击)。 为了解决这个问题,我放了一个这样的布尔变量:

var isNavigating = false

然后,当我必须导航时,我会检查它

    btn.setOnClickListener {
   if (!isNavigating) {
            isNavigating = true
            findNavController().navigate(R.id.action_firstFragment_to_secondFragment)
        }
    }

这是为了避免几乎同时进行多次点击

问题出在 popBackStackInclusive="true" 上。 如文档中所述:

You can also include app:popUpToInclusive="true" to indicate that the destination specified in app:popUpTo should also be removed from the back stack.

所以我指定的目的地是第一个片段,当我弹出我的第二个片段时,第一个片段也被弹出。

所以我通过删除 app:popUpToInclusive="true"

解决了这个问题

最终代码是这样的:

<action
    android:id="@+id/action_secondFragment_to_secondActivity"
    app:destination="@id/secondActivity"
    app:popUpTo="@id/firstFragment"/>