首页 > 解决方案 > 在导航组件的起始目的地时如何处理后退按钮

问题描述

我已经开始使用新的导航组件,我真的很喜欢它!我确实有一个问题 - 当我在图表的起始目的地时,我应该如何处理后退按钮?

这是我现在使用的代码:

findNavController(this, R.id.my_nav_host_fragment)
                .navigateUp()

当我在图表上的任何位置时,它都工作得很好,它把我送回去,但是当我在它的开始时——应用程序崩溃了,因为后台堆栈是空的。

这一切对我来说都很有意义,我只是不知道如何处理它。

虽然我可以检查当前片段的 ID 是否与我知道是图根的 ID 相同,但我正在寻找一种更优雅的解决方案,例如图表中当前位置的布尔标志是否是起始位置与否。

想法?

标签: android-architecture-componentsandroid-architecture-navigationandroid-navigationandroid-jetpack-navigation

解决方案


我有一个类似的场景,我想在开始目的地完成活动,并在导航图更下方时执行常规“navigateUp”。我通过一个简单的扩展函数解决了这个问题:

fun NavController.navigateUpOrFinish(activity: AppCompatActivity): Boolean {
return if (navigateUp()) {
    true
} else {
    activity.finish()
    true
}

}

然后这样称呼它:

override fun onSupportNavigateUp() = 
        findNavController(R.id.nav_fragment).navigateUpOrFinish(this)

但是我无法使用 NavigationUI,因为每当我在起始目的地时,它都会隐藏后退箭头。所以而不是:

NavigationUI.setupActionBarWithNavController(this, controller)

我手动控制了主页图标:

setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_navigation_back)

推荐阅读