当前位置: 首页 > 知识库问答 >
问题:

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

吴俊风
2023-03-14

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

这是我现在使用的代码

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

当我在图表上的任何地方时,它都工作得很好,它会将我发回,但当我在开始时-应用程序崩溃,因为Backback是空的。

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

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

思想?

共有3个答案

管翼
2023-03-14

你不应该覆盖“onBackPressed”,你应该覆盖“onSupportNavigateUp”并放在那里

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

从官方留档:您还将覆盖AppCompatActivity.onSupport Navigate Up()并调用NavController.navigate

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

盖晋
2023-03-14

覆盖“活动”中的“反压”,并检查当前目的地是否为起始目的地。

实际上它看起来像这样:

@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();
}
郭均
2023-03-14

我有一个类似的场景,当我在开始目的地时,我想完成活动,当我在导航图的较低位置时,我想做一个常规的“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)
 类似资料:
  • 我想知道如何使用导航控制器正确处理系统后退按钮动作。在我的应用程序中,我有两个片段(例如,fragment1和fragment2),我在fragment1中有一个操作,目标是fragment2。除了一件事之外,所有的工作都很好--当用户按下fragment2中的system back按钮时,我希望显示一个对话框(例如使用DialogFragment)来确认退出。实施这种行为的最佳方式是什么?如果我

  • 前几天,我开始注意到我的应用程序中有一些东西,它非常不一致。有时会发生,有时不会。 我正在使用导航组件来处理应用程序中的导航,我开始注意到,有时,当通过操作栏后退按钮或设备后退按钮弹出后退时,它返回到一个不再是起始目的地(或至少不应该是)的片段。 在我的例子中,应用程序在MainFragment中启动,经过身份验证后移动到DashboardFragment。这是一种非常常见的情况。 应用程序中的导

  • 我正在使用android中的导航组件,最初我在其中设置了6个片段。问题是我添加了一个新片段(ProfileFragment)。 当我从开始目标导航到此新片段时,按下本机后退按钮不会弹出当前片段。相反,它只是停留在我所在的片段上——后退按钮什么都不做。 这是我的navigation.xml: 在上图中,突出显示的箭头(左侧)是我遇到问题的导航操作。 在我的片段代码中,我导航如下: 其他导航操作正在按

  • 问题内容: 如何更改导航栏的后退按钮的字体。 后退按钮可以是“后退”,也可以是前一个视图控制器的标题。 我认为这可以工作: 但可选的return 。 问题答案: 刚刚测试了您的代码,看来行返回的原因实际上是因为返回nil。因此,如果您将该属性设置为有效的字体名称,则代码应该运行无错误- 即使显式设置为nil。 但是无论如何,正如我在测试中看到的那样,这条线不会给您显然想要的结果。前导的可选内容不应

  • 问题内容: 现在我有两个视图控制器。我的问题是,更改为第二个视图控制器后,我不知道如何隐藏后退按钮。主要是我在Objective-C中找到的参考。如何快速编码? 在Objective-C中隐藏后退按钮代码 问题答案: 根据该文件为:

  • 我正在使用内置的抽屉菜单来运行我的应用程序。我不太明白如何处理后退按钮。当它被按下时,我希望它再次加载第一个片段。Fragment1。 因此,当应用程序启动时,您会看到Fragment1启动。然后,他们可以单击片段2-5转到其他页面。在所有这些页面中,我希望后退按钮将用户带回Fragment1。用户应该能够通过后退按钮退出应用程序的唯一位置是Fragment1。 因为这一切都是由一个碎片活动来处理