Android - 在单个 activity 应用程序中使用工具栏按钮弹出 Back Stack
Android - pop Back Stack with toolbar button in a single activity app
我有一个 activity 应用程序 (Java)。如果用户没有登录,他首先看到的是一个欢迎屏幕,他可以在其中登录,然后转到主页片段。如果用户已登录,则用户会直接转到主页片段。
该应用程序有许多选项卡和辅助屏幕,每个都是片段。
工具栏始终可见,并包含一个注销按钮。如果用户注销,他应该移动到欢迎屏幕,整个后退堆栈应该被删除。
我之前在多个活动中尝试过这个,它很简单,因为我用过:
startActivity(new Intent(TabsActivity.this, LoginActivity.class));
finish();
但是,如果我使用 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);
但 none 有效。
我如何才能在注销并删除后退堆栈后转到欢迎屏幕?
更新:
我尝试了以下方法:
<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);
但是当我在注销后单击后退按钮进入欢迎屏幕时,我仍然可以 return 返回到上一个屏幕。
您可以将启动画面添加为全局目标。假设操作的名称为 globalSplashScreenAction
,您可以像 navGraphDirections.globalSplashScreenAction
一样访问它
您可以从导航图中右键单击初始屏幕目标 UI 并将其设置为全局目标。
我有一个 activity 应用程序 (Java)。如果用户没有登录,他首先看到的是一个欢迎屏幕,他可以在其中登录,然后转到主页片段。如果用户已登录,则用户会直接转到主页片段。
该应用程序有许多选项卡和辅助屏幕,每个都是片段。
工具栏始终可见,并包含一个注销按钮。如果用户注销,他应该移动到欢迎屏幕,整个后退堆栈应该被删除。
我之前在多个活动中尝试过这个,它很简单,因为我用过:
startActivity(new Intent(TabsActivity.this, LoginActivity.class));
finish();
但是,如果我使用 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);
但 none 有效。
我如何才能在注销并删除后退堆栈后转到欢迎屏幕?
更新:
我尝试了以下方法:
<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);
但是当我在注销后单击后退按钮进入欢迎屏幕时,我仍然可以 return 返回到上一个屏幕。
您可以将启动画面添加为全局目标。假设操作的名称为 globalSplashScreenAction
,您可以像 navGraphDirections.globalSplashScreenAction
您可以从导航图中右键单击初始屏幕目标 UI 并将其设置为全局目标。