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不是后退按钮,应该是左上角的“向上”箭头