IllegalArgumentException:此NavController未知导航目标xxx

2020年7月13日 31点热度 0条评论

当我尝试从一个片段导航到另一个时,我遇到了新的Android导航体系结构组件的问题,我得到了这个奇怪的错误:

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

除此特定导航外,其他所有导航都工作正常。

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

任何帮助将不胜感激。

解决方案如下:

就我而言,如果用户非常快地单击同一 View 两次,则会发生此崩溃。因此,您需要实现某种逻辑以防止多次快速单击……这很烦人,但这似乎是必要的。

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

编辑3/19/2019 :为了进一步说明,此崩溃并非仅通过“非常快速地单击相同的 View 两次”即可再现。或者,您可以只用两个手指同时单击两个(或多个) View ,每个 View 都有它们自己将执行的导航。当您有项目列表时,这特别容易做到。上面有关多次点击防护的信息将处理这种情况。

编辑4/16/2020 :万一您对上面的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
    }
}