Android 如何在非启动目的地按back press退出应用程序?

Android 如何在非启动目的地按back press退出应用程序?,android,android-architecture-components,android-architecture-navigation,Android,Android Architecture Components,Android Architecture Navigation,假设我有一个类似于以下内容的导航图: --------- --------- | Home | ---->| Other | --------- --------- | | V --------- | Login | --------- 如果用户没有登录,我必须先显示登录屏幕,然后他才能继续。根据,我检查用户是否登录到HomeFragment。如果他不在,我打开LoginFragment。到目前为止,一切顺利 但是,如果用户在登录片段中按返回

假设我有一个类似于以下内容的导航图:

---------      ---------
| Home  | ---->| Other |
---------      ---------
    |
    |
    V
---------
| Login |
---------
如果用户没有登录,我必须先显示登录屏幕,然后他才能继续。根据,我检查用户是否登录到
HomeFragment
。如果他不在,我打开
LoginFragment
。到目前为止,一切顺利

但是,如果用户在
登录片段中按返回键,我希望应用程序退出。但是由于
loginframent
不是起始目标,它将简单地打开
homeframent
,这将再次打开
loginframent

目前,如果当前目的地是
loginfracent
,我通过覆盖主机
Activity
中的
onBackPressed()
finish()
中的
Activity
退出应用程序

但这让人感觉很不舒服。我想这一定是一个非常常见的导航场景。那么,有没有什么“惯用”的方法可以做到这一点呢?

正如您在中看到的,要覆盖后退按钮,您应该使用:

@Override
public boolean onSupportNavigateUp() {
    return Navigation.findNavController(this, R.id.nav_host_fragment).navigateUp();
}

我找到了另一个你可以看的。发生这种情况是因为片段被添加到了
backbackback
。尝试不要将
loginframent
添加到backstack。不要为
LoginFragment
事务调用
addToBackStack()
。希望这能对您有所帮助。

我相信解决您问题的最简单(也是最合适的)方法就是在您的操作中使用
app:popUpTo
app:popuptinclusive
,这需要在家-->登录

这是一个相关的例子,当你从初始屏幕移动到主屏幕时,当他按下“后退”按钮时,你不想回到初始屏幕

这是您的操作方式:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

   requireActivity().onBackPressedDispatcher.addCallback(this) {
        requireActivity().finish()
    }
}

更多信息

我还在应用程序的登录页面中使用了
on backpressed
,与您使用的方法相同,如果用户碰巧登录页面,我会在登录页面上有效地“诱捕”用户。我对您当前正在做的事情没有任何问题。使用一个活动并将片段用于登录和其他活动如何?然后,当调用
onBackPressed()
并显示登录片段时,您只需
finish()
主页活动。在这种情况下,您使用的实现是正确的。您可以更改片段而无需添加到backbackback,给你你想要的行为。我说的是使用导航组件。不是
FragmentTransaction
s不是后退按钮,应该是左上角的“向上”箭头