kotlin 在Android导航架构中,如何检查当前Fragment是否为最后一个Fragment?

c90pui9n  于 2023-11-21  发布在  Kotlin
关注(0)|答案(4)|浏览(172)

我需要显示自定义的AlertDialog,但只有在调用NavController.navigateUp()后没有更多的片段时。我现在的代码做了类似的事情,但有一个bug:

override fun onBackPressed() {

    if (navController.navigateUp()) {
        return
    }

    showQuitDialog()
}

字符串
这在某种程度上是可行的,但是如果我取消AlertDialog并且不退出应用,navController已经导航到NavGraph根目录,这不是我在AlertDialog出现时所在的片段。所以,如果我尝试使用该片段中的任何导航操作,我会得到错误:
java.lang.IllegalArgumentException:导航目标com.example.test/actionNavigateToNextFragment对此NavController未知
如果我可以访问NavController中的mBackStack字段,这个问题可以解决,但它是package private,我不能在当前项目中使用反射。但如果它是public,我会按以下方式使用它:

override fun onBackPressed() {

    // 2 because first one is NavGraph, second one is last fragment on the stack
    if(navController.mBackStack.size > 2) { 
        navController.navigateUp()
        return
    }

    showQuitDialog()
}


有没有一种方法可以做到这一点没有反思?

balp4ylt

balp4ylt1#

您可以将起始目标的ID与当前目标的ID进行比较。类似于:

override fun onBackPressed() = when {
    navController.graph.startDestination == navController.currentDestination?.id -> showQuitDialog()
    else -> super.onBackPressed()
}

字符串
希望对你有帮助。

cx6n0qe3

cx6n0qe32#

对于任何目的地尝试此操作(您可以在导航图中找到您的目的地ID):

private fun isDesiredDestination(): Boolean {
    return with(navController) {
        currentDestination == graph[R.id.yourDestinationId]
    }
}

字符串

lb3vh1jj

lb3vh1jj3#

比较目的地的ID可能不是最好的解决方案,因为您可以在backstack上有多个具有相同ID但不同参数的屏幕。
这里有一个替代方案:

val isRootScreen = navController.previousBackStackEntry == null

字符串

cgvd09ve

cgvd09ve4#

如果你想要这是一个按钮,可以这么说,你可以有这个

yourbutton.setOnClickListener {
            val currentFragment = navController.currentDestination?.id
           when (navController.graph.startDestination == currentFragment) {
                true ->  { //Go here}
                 // Go to the app home
                else -> onBackPressed()
            }
        }

字符串

相关问题