在导航组件的起始目标位置时如何处理后退按钮

Mic*_*ato 5 android-navigation android-architecture-components android-architecture-navigation

我已经开始使用新的导航组件,而且我真的在挖掘它!但是,我确实有一个问题-当我处于图表的起始目标位置时,应该如何处理后退按钮?

这是我现在使用的代码:

findNavController(this, R.id.my_nav_host_fragment)
                .navigateUp()
Run Code Online (Sandbox Code Playgroud)

当我在图表上的任何地方时,它都工作得很好,它使我返回,但是当我在它的开始时,由于后备箱为空,因此应用程序崩溃。

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

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

有想法吗?

Ale*_*lex 6

您不应覆盖“ onBackPressed”,而应覆盖“ onSupportNavigateUp”并将其放置在此处

findNavController(this, R.id.my_nav_host_fragment)
            .navigateUp()
Run Code Online (Sandbox Code Playgroud)

从官方文档: 您还将覆盖AppCompatActivity.onSupportNavigateUp()并调用NavController.navigateUp

https://developer.android.com/topic/libraries/architecture/navigation/navigation-implementing

  • 官方文档说app:defaultNavHost =“ true”属性可确保NavHostFragment拦截系统的“后退”按钮。从文档中显而易见,您必须重写AppCompatActivity.onSupportNavigateUp()方法才能支持应用程序工具栏的后退按钮。谢谢。 (3认同)

Shy*_*ine 6

覆盖onBackPressed您的活动并检查当前目的地是否是开始目的地。

实际上它看起来像这样:

@Override
public void onBackPressed() {
    if (Navigation.findNavController(this,R.id.nav_host_fragment)
            .getCurrentDestination().getId() == R.id.your_start_destination) {
        // handle back button the way you want here
        return;
    }
    super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

fun NavController.navigateUpOrFinish(activity: AppCompatActivity): Boolean {
return if (navigateUp()) {
    true
} else {
    activity.finish()
    true
}
Run Code Online (Sandbox Code Playgroud)

}

然后像这样调用它:

override fun onSupportNavigateUp() = 
        findNavController(R.id.nav_fragment).navigateUpOrFinish(this)
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用NavigationUI,因为每当我在开始目标位置时,这都会隐藏后退箭头。所以代替:

NavigationUI.setupActionBarWithNavController(this, controller)
Run Code Online (Sandbox Code Playgroud)

我手动控制了主页图标:

setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_navigation_back)
Run Code Online (Sandbox Code Playgroud)


Mik*_*ell 0

如果您的意思是“根”导航图的开始(以防万一您有嵌套导航图),那么您根本不应该显示向上按钮,至少根据导航原则