【问题标题】:In Android Navigation Architecture, how can I check if current Fragment is the last one?在 Android Navigation Architecture 中,如何检查当前 Fragment 是否是最后一个?
【发布时间】:2019-02-06 06:05:39
【问题描述】:

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

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()
}

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

【问题讨论】:

    标签: android kotlin android-alertdialog android-navigation onbackpressed


    【解决方案1】:

    您可以将起始目的地的 ID 与当前目的地的 ID 进行比较。比如:

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

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-26
        • 2023-03-25
        • 2022-07-06
        • 2011-08-30
        相关资源
        最近更新 更多