说我有一个类似于此的导航图:
--------- ---------
| Home | ---->| Other |
--------- ---------
|
|
V
---------
| Login |
---------
如果用户尚未登录,则必须先显示登录屏幕,然后他才能继续。根据{{3}},我检查用户是否登录HomeFragment
。如果不是,我打开LoginFragment
。到目前为止,一切都很好。
但是,如果用户按下LoginFragment
,我希望该应用程序退出。但是由于LoginFragment
不是起始目的地,因此它将简单地打开HomeFragment
,这将再次打开LoginFragment
。
当前,我通过覆盖主机onBackPressed()
中的Activity
和finish()
Activity
中的LoginFragment
(如果当前目的地为.asDriver
)来退出应用程序。
但是,这感觉有点骇人听闻。我想这一定是一个非常常见的导航方案。那么,有没有“惯用”的方式来做到这一点?
答案 0 :(得分:0)
如果您使用活动进行导航,则完成旧活动的最佳方法是:
Intent intent = new Intent(getApplicationContext(), YOUR_NEXT_ATCIVITY.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
然后,每当您单击返回时,应用程序都会完成
编辑
因此,由于您正在使用片段,因此您将找到所需的here,这是一篇有关如何管理Fragment Stack
的好文章
答案 1 :(得分:0)
您可以在documentation中看到,要覆盖后退按钮,您应该使用
@Override
public boolean onSupportNavigateUp() {
return Navigation.findNavController(this, R.id.nav_host_fragment).navigateUp();
}
我发现了另一个documentation,你可以看看。
答案 2 :(得分:0)
之所以发生这种情况,是因为该片段已添加到BackStack
中。尝试不要将LoginFragment
添加到堆栈中。不要为addToBackStack()
交易致电LoginFragment
。希望对您有帮助。
答案 3 :(得分:0)
我认为最简单(并且我认为适当)的解决方案是,在从首页->登录进行的操作中,基本上使用app:popUpTo
和app:popUpToInclusive
。
这是一个相关示例,当您从启动画面切换到主屏幕时,您不想在他按下“返回”按钮时回到启动画面。
答案 4 :(得分:0)
这是您的操作方式:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity().onBackPressedDispatcher.addCallback(this) {
requireActivity().finish()
}
}
更多信息here