首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在NavController中避免安卓导航IllegalArgumentException

在NavController中避免安卓导航IllegalArgumentException
EN

Stack Overflow用户
提问于 2019-02-14 19:29:14
回答 2查看 9.1K关注 0票数 20

我最近切换到Android导航,但遇到了相当多的情况(在代码的不同部分),我得到:

代码语言:javascript
复制
Fatal Exception: java.lang.IllegalArgumentException
navigation destination com.xxx.yyy:id/action_aFragment_to_bFragment is unknown to this NavController

在每种情况下,代码都是如下所示的简单调用:

代码语言:javascript
复制
findNavController(this, R.id.navigation_host_fragment).navigate(R.id.action_aFragment_to_bFragment)

通常响应于按钮的按下。

还不清楚为什么会抛出这个错误。我现在怀疑的是,在某些设备上,onClickListener不知何故被调用了两次,导致导航被再次调用(导致它在当时处于错误的状态)。这种怀疑的原因是,这似乎最经常发生在可能在导航调用之前有一个“长”运行的操作的情况下。不过,我不能在我自己的设备上重现它。

关于如何避免这个问题的想法(或者实际上,这个问题的实际根本原因是什么)?

我不想使用全局操作;我担心在后台堆栈中引入更多的意外状态。而且,我真的不希望每次进行导航调用时都要尝试测试currentstate。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-16 20:10:19

您可以在导航前使用以下代码来检查当前目的地是否正确。这将确保调用仅从当前片段发生。可以通过同时单击两个视图(列表中的两个项目)来重现此问题。

代码语言:javascript
复制
if (findNavController().currentDestination?.id == R.id.currentFragment) {
        findNavController().navigate(R.id.action_current_next)
}
票数 25
EN

Stack Overflow用户

发布于 2019-02-14 20:44:50

好吧,让我向你解释这个异常是通过的,因为我们从一个片段(目标)调用一个动作,而这个片段不是堆栈上的当前目标。

也就是说,您正在调用一个操作

代码语言:javascript
复制
R.id.action_aFragment_to_bFragment

来自fragmentA但在navController中的当前目标是fragmentA以外的其他目标。这就是为什么navController会通过该异常:

代码语言:javascript
复制
navigation destination com.xxx.yyy:id/action_aFragment_to_bFragment is unknown to this NavController

您可以在导航之前检查当前目的地。喜欢

代码语言:javascript
复制
 Toast.makeText(context,view?.findNavController()?.currentDestination?.label,Toast.LENGTH_SHORT).show()

这将向您显示当前的目的地,我相信这将是其他目的地。

当我们替换动作以外的片段(比如通过旧方法,而不是导航),或者在调用动作之前对片段进行popUp时,就会发生这种情况。

如果是这种情况,那么您必须使用全局操作,因为它们并不关心当前的目的地是什么。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54689361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档