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

标签 android kotlin android-architecture-navigation android-navigation android-jetpack-navigation

当我尝试从一个 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 - 在 Android 上刷新 View 或 Activity

android - 在 ConstraintLayout 中使用 <include> 和 <merge>

android - 底部导航 View : How to remove hypheanted labels

kotlin - 在 Kotlin 中为具有函数链的可空值返回默认值

android - Kotlin 结合了 2 个以上的流程

android-studio - 无法为Android Studio 3.0安装Gradle

android - Kotlin 中的 Retrofit2 + SimpleXML : MethodException: Annotation must mark a set or get method

Android 导航库深度链接 : How to synthesise backstack

java - 为什么 args 类不生成导航图 fragment ?

android - 在两个 fragment 之间传递一个参数,每个 fragment 都在不同的导航图中