This question already has answers here:
IllegalArgumentException: navigation destination xxx is unknown to this NavController
(37个答案)
7个月前关闭。
我最近切换到Android导航,但是遇到了很多情况(在代码的不同部分),我得到:
在每种情况下,代码都是简单的调用,例如:
通常是响应按钮的按下。
目前尚不清楚为什么会引发此错误。我目前的怀疑是,onClickListener在某些设备上被某种程度上调用了两次,从而导致导航被第二次调用(从而导致导航当时处于错误状态)。引起怀疑的原因是,这似乎最经常发生在某些情况下,即在导航调用之前可能需要“长时间”运行的操作。但是,我无法在自己的设备上重新创建它。
关于如何避免此问题的想法(或者实际上,是该问题的真正根本原因是什么)?
我不想使用全局 Action ;我对向堆栈引入更多意外状态持谨慎态度。而且,我真的希望不必在每次进行导航调用时都尝试测试当前状态。
(37个答案)
7个月前关闭。
我最近切换到Android导航,但是遇到了很多情况(在代码的不同部分),我得到:
Fatal Exception: java.lang.IllegalArgumentException
navigation destination com.xxx.yyy:id/action_aFragment_to_bFragment is unknown to this NavController
在每种情况下,代码都是简单的调用,例如:
findNavController(this, R.id.navigation_host_fragment).navigate(R.id.action_aFragment_to_bFragment)
通常是响应按钮的按下。
目前尚不清楚为什么会引发此错误。我目前的怀疑是,onClickListener在某些设备上被某种程度上调用了两次,从而导致导航被第二次调用(从而导致导航当时处于错误状态)。引起怀疑的原因是,这似乎最经常发生在某些情况下,即在导航调用之前可能需要“长时间”运行的操作。但是,我无法在自己的设备上重新创建它。
关于如何避免此问题的想法(或者实际上,是该问题的真正根本原因是什么)?
我不想使用全局 Action ;我对向堆栈引入更多意外状态持谨慎态度。而且,我真的希望不必在每次进行导航调用时都尝试测试当前状态。
最佳答案
您可以在导航之前使用以下代码来检查当前目的地是否正确。这样可以确保仅从当前片段进行调用。可以通过同时单击两个 View (列表中的两个项目)来重现此问题。
if (findNavController().currentDestination?.id == R.id.currentFragment) {
findNavController().navigate(R.id.action_current_next)
}