【问题标题】:Avoiding Android navigation IllegalArgumentException in NavController [duplicate]在 NavController 中避免 Android 导航 IllegalArgumentException [重复]
【发布时间】:2020-06-15 16:35:01
【问题描述】:

我最近切换到 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 在某些设备上被调用了两次,导致导航被第二次调用(导致它当时处于错误的状态)。这种怀疑的原因是,这似乎最常发生在导航调用之前可能有“长时间”运行的操作的情况下。不过,我无法在自己的设备上重新创建它。

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

我不想使用 Global Actions;我对在后台引入更多意想不到的状态持谨慎态度。而且我真的不希望每次进行导航调用时都必须尝试测试当前状态。

【问题讨论】:

    标签: android android-architecture-navigation


    【解决方案1】:

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

    if (findNavController().currentDestination?.id == R.id.currentFragment) {
            findNavController().navigate(R.id.action_current_next)
    }
    

    【讨论】:

    • 目前为止我见过的最好的(唯一的)方法来处理这个问题。如果您连续快速按下按钮(即,在视图刷新之前按下按钮),也会出现问题。令人烦恼的是,导航库如此繁琐,很容易“脱离”它的片段。
    • 这行得通,但您需要找出函数被多次调用的原因。就我而言,每次重新启动片段时我都会注册一个观察者,并且它从未取消注册,因此它会随着时间的推移累积调用。
    • 有没有办法获取 R.id.currentFragment?
    • 如果我们需要传递args怎么办?
    • @JachumbelechaoUntoMantekilla 为您提供currentDestionation.id 也没有匹配任何R.id?对我来说,它在一个完全不同的范围内:21312307901000066
    【解决方案2】:

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

    即 你正在调用一个动作

    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()
    

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

    当我们替换动作以外的片段时会发生这种情况(例如通过旧方法而不是导航)或者我们在调用动作之前弹出该片段。

    如果是这种情况,那么您必须使用 Global Action,因为他们不在乎当前目的地是什么。

    【讨论】:

    • 我知道为什么会调用异常。弹出 Toast 并没有真正帮助我,因为这是生产代码(数千名用户中有少数用户出现此错误),正如我所说,我无法在我拥有的任何设备上重新创建它。如果可以的话,我早就解决了这个问题。在导航框架之外实现的这个应用程序中也没有导航 - 这就是进行重写的重点,现在已经出现了这个问题。
    • 吐司只是为了澄清......我说是因为很多人都有我上面描述的这个问题,包括我。好吧,如果不是这种情况,那就是库中的一个错误。你知道这个库仍处于测试状态。
    • 我正在使用这两个库,我没有收到任何错误。实现 'android.arch.navigation:navigation-fragment-ktx:1.0.0-beta01' 实现 'android.arch.navigation:navigation-ui-ktx:1.0.0-beta01'
    • 有些人会遇到这个问题,因为他们使用的是旧版本的库。
    • 关于旧版本的事情。一年后。 v2.2.1,我正在与这种荒谬作斗争。
    猜你喜欢
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    相关资源
    最近更新 更多