草庐IT

android - IllegalArgumentException : navigation destination xxx is unknown to this NavController

coder 2023-06-05 原文

当我尝试从一个 fragment 导航到另一个 fragment 时,我遇到了新的 Android 导航架构组件的问题,我收到了这个奇怪的错误:

java.lang.IllegalArgumentException: navigation destination XXX
is unknown to this NavController

除了这个特定的导航之外,其他所有导航都可以正常工作。

我使用 Fragment 的 findNavController() 函数来访问 NavController

任何帮助将不胜感激。

最佳答案

在我的例子中,如果用户非常快速地两次点击同一个 View ,就会发生这种崩溃。所以你需要实现某种逻辑来防止多次快速点击......这很烦人,但似乎是必要的。

您可以在此处阅读有关防止这种情况的更多信息:Android Preventing Double Click On A Button

2019 年 3 月 19 日编辑:进一步澄清一下,这种崩溃并非完全可以通过“非常快速地单击两次相同的 View ”来重现。或者,您可以只用两根手指同时单击两个(或更多) View ,每个 View 都有自己的导航,它们将执行。当您有一个项目列表时,这尤其很容易做到。以上关于防止多次点击的信息将处理这种情况。

编辑 2020 年 4 月 16 日:以防您对阅读上面的 Stack Overflow 帖子不太感兴趣,我将包括我自己的 (Kotlin) 解决方案用了很久了。

OnSingleClickListener.kt

class OnSingleClickListener : View.OnClickListener {

    private val onClickListener: View.OnClickListener

    constructor(listener: View.OnClickListener) {
        onClickListener = listener
    }

    constructor(listener: (View) -> Unit) {
        onClickListener = View.OnClickListener { listener.invoke(it) }
    }

    override fun onClick(v: View) {
        val currentTimeMillis = System.currentTimeMillis()

        if (currentTimeMillis >= previousClickTimeMillis + DELAY_MILLIS) {
            previousClickTimeMillis = currentTimeMillis
            onClickListener.onClick(v)
        }
    }

    companion object {
        // Tweak this value as you see fit. In my personal testing this
        // seems to be good, but you may want to try on some different
        // devices and make sure you can't produce any crashes.
        private const val DELAY_MILLIS = 200L

        private var previousClickTimeMillis = 0L
    }

}

ViewExt.kt

fun View.setOnSingleClickListener(l: View.OnClickListener) {
    setOnClickListener(OnSingleClickListener(l))
}

fun View.setOnSingleClickListener(l: (View) -> Unit) {
    setOnClickListener(OnSingleClickListener(l))
}

HomeFragment.kt

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    settingsButton.setOnSingleClickListener {
        // navigation call here
    }
}

关于android - IllegalArgumentException : navigation destination xxx is unknown to this NavController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51060762/

有关android - IllegalArgumentException : navigation destination xxx is unknown to this NavController的更多相关文章

随机推荐