无法从当前目的地找到导航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"/>
在我的应用程序中,我有 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"/>