我最近切换到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不知何故被调用了两次,导致导航被再次调用(导致它在当时处于错误的状态)。这种怀疑的原因是,这似乎最经常发生在可能在导航调用之前有一个“长”运行的操作的情况下。不过,我不能在我自己的设备上重现它。
关于如何避免这个问题的想法(或者实际上,这个问题的实际根本原因是什么)?
我不想使用全局操作;我担心在后台堆栈中引入更多的意外状态。而且,我真的不希望每次进行导航调用时都要尝试测试currentstate。
发布于 2019-05-16 20:10:19
您可以在导航前使用以下代码来检查当前目的地是否正确。这将确保调用仅从当前片段发生。可以通过同时单击两个视图(列表中的两个项目)来重现此问题。
if (findNavController().currentDestination?.id == R.id.currentFragment) {
findNavController().navigate(R.id.action_current_next)
}发布于 2019-02-14 20:44:50
好吧,让我向你解释这个异常是通过的,因为我们从一个片段(目标)调用一个动作,而这个片段不是堆栈上的当前目标。
也就是说,您正在调用一个操作
R.id.action_aFragment_to_bFragment来自fragmentA但在navController中的当前目标是fragmentA以外的其他目标。这就是为什么navController会通过该异常:
navigation destination com.xxx.yyy:id/action_aFragment_to_bFragment is unknown to this NavController您可以在导航之前检查当前目的地。喜欢
Toast.makeText(context,view?.findNavController()?.currentDestination?.label,Toast.LENGTH_SHORT).show()这将向您显示当前的目的地,我相信这将是其他目的地。
当我们替换动作以外的片段(比如通过旧方法,而不是导航),或者在调用动作之前对片段进行popUp时,就会发生这种情况。
如果是这种情况,那么您必须使用全局操作,因为它们并不关心当前的目的地是什么。
https://stackoverflow.com/questions/54689361
复制相似问题