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

xin*_*aiz 6 android android-alertdialog kotlin android-navigation onbackpressed

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

override fun onBackPressed() {

    if (navController.navigateUp()) {
        return
    }

    showQuitDialog()
}
Run Code Online (Sandbox Code Playgroud)

这在某种程度上可行,但是如果我取消AlertDialog且不退出应用程序,则该应用程序navController已经导航到NavGraph根目录,而不是AlertDialog出现时所在的片段。因此,如果我尝试使用该片段中的任何导航操作,则会收到错误消息:

java.lang.IllegalArgumentException:此NavController未知导航目标com.example.test / actionNavigateToNextFragment

如果我可以访问中的mBackStack字段NavController,但是它是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()
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点而无需反思?

小智 12

您可以将起始目标的ID与当前目标的ID进行比较。就像是:

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

希望能帮助到你。