Android - 在单个活动应用程序中使用工具栏按钮弹出 Back Stack

Posted

技术标签:

【中文标题】Android - 在单个活动应用程序中使用工具栏按钮弹出 Back Stack【英文标题】:Android - pop Back Stack with toolbar button in a single activity app 【发布时间】:2021-08-21 00:26:48 【问题描述】:

我有一个单一的活动应用程序 (Java)。如果用户没有登录,他首先看到的是一个欢迎屏幕,他可以在其中登录然后移动到主页片段。如果用户已登录,则用户直接转到主页片段。

该应用程序有许多选项卡和辅助屏幕,每个都是片段。

工具栏始终可见,并包含一个退出按钮。如果用户退出,他应该移动到欢迎屏幕并且应该删除整个后台堆栈。

我之前曾尝试过多个活动,它很简单,因为我使用过:

startActivity(new Intent(TabsActivity.this, LoginActivity.class));
finish();

但是,如果我使用完成,当我点击退出时,应用程序只会关闭。

当从初始屏幕移动到欢迎屏幕时,我可以毫无问题地弹出返回堆栈,因为我知道“从”和“到”片段。使用导航组件,我在 NavGraph 中有这个

<action
        android:id="@+id/action_splashScreenFragment_to_homeFragment"
        app:destination="@id/homeFragment"
        app:popUpTo="@id/splashScreenFragment"
        app:popUpToInclusive="true"/>
<action
        android:id="@+id/action_splashScreenFragment_to_welcomeFragment"
        app:destination="@id/welcomeFragment"
        app:popUpTo="@id/splashScreenFragment"
        app:popUpToInclusive="true"/>

然后我会使用

Navigation.findNavController(view)
   .navigate(R.id.action_splashScreenFragment_to_welcomeFragment);

但是,在这种情况下,由于“退出”按钮位于工具栏中,因此可以在应用程序的任何位置访问它。欢迎屏幕的导航在 MainActivity 中处理。

navController.navigate(R.id.welcomeFragment);

就像我说的,我尝试添加 finish() 并关闭了整个应用程序。

我也试过添加

navController.popBackStack(R.id.welcomeFragment, true);

navController.popBackStack(R.id.homeFragment, true);

但没有任何效果。

退出后如何移至欢迎屏幕并移除后台堆栈?

更新:

我尝试了以下方法:

<action
    android:id="@+id/action_global_welcomeFragment"
    app:destination="@id/welcomeFragment"
    app:popUpTo="@id/welcomeFragment"
    app:popUpToInclusive="true" />

在 MainActivity 中:

navController.navigate(R.id.action_global_welcomeFragment);

但是,当我在退出后单击返回按钮将我带到欢迎屏幕时,我仍然可以返回到上一个屏幕。

【问题讨论】:

【参考方案1】:

您可以将启动画面添加为全局目标。假设该操作的名称为 globalSplashScreenAction,您可以像 navGraphDirections.globalSplashScreenAction 一样访问它

您可以在导航图 UI 中右键单击初始屏幕目标并将其设置为全局目标。

【讨论】:

我将 Welcome(不是 Splash)设为全局(我已将此作为更新添加到我的原始帖子中),但当我点击返回按钮时,我仍然可以转到上一个屏幕。 我终于让它工作了。我将全局操作更改为 app:popUpTo="@id/homeFragment",包括在内。谢谢! 当您发表评论时,我很害怕,这就是您需要做的,正确!不客气

以上是关于Android - 在单个活动应用程序中使用工具栏按钮弹出 Back Stack的主要内容,如果未能解决你的问题,请参考以下文章

Android:仅阻止单个活动访问互联网

Android:单个屏幕上有很多活动?

是否有在单个活动中处理多个片段的 Android 设计模式?

在所有活动中使用工具栏 (Android)

Android Webview问题:如何在单个活动中打开具有不同按钮的不同页面

工具栏没有隐藏在 android 活动中