如何在未启动的目标位置按背面退出应用程序?

时间:2019-02-09 15:39:43

标签: android android-architecture-components android-architecture-navigation

说我有一个类似于此的导航图:

---------      ---------
| Home  | ---->| Other |
---------      ---------
    |
    |
    V
---------
| Login |
---------

如果用户尚未登录,则必须先显示登录屏幕,然后他才能继续。根据{{​​3}},我检查用户是否登录HomeFragment。如果不是,我打开LoginFragment。到目前为止,一切都很好。

但是,如果用户按下LoginFragment,我希望该应用程序退出。但是由于LoginFragment不是起始目的地,因此它将简单地打开HomeFragment,这将再次打开LoginFragment

当前,我通过覆盖主机onBackPressed()中的Activityfinish() Activity中的LoginFragment(如果当前目的地为.asDriver)来退出应用程序。

但是,这感觉有点骇人听闻。我想这一定是一个非常常见的导航方案。那么,有没有“惯用”的方式来做到这一点?

5 个答案:

答案 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:popUpToapp:popUpToInclusive

这是一个相关示例,当您从启动画面切换到主屏幕时,您不想在他按下“返回”按钮时回到启动画面。

enter image description here

答案 4 :(得分:0)

这是您的操作方式:

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

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

更多信息here