在我的应用程序中,抽屉导航中有一些菜单项。当用户点击这些项目之一并导航到相应的 fragment 时,我希望清除 fragment 后退堆栈,除了他们刚刚导航到的 fragment 。让我举例说明:
在我的抽屉导航中,用户可以选择打开 fragment F1、F2、F3、F4、F5、F6。首次打开应用程序时,用户按 F1 启动。假设从 F1 开始,用户使用 fragment View 本身内的按钮打开 fragment F7 -> F8 -> F9 -> F10。此时,后台堆栈如下所示:
F1 -> F7 -> F8 -> F9 -> F10
假设从这里,用户打开抽屉导航并选择 F2。我想要发生的是上面的返回堆栈被清除并仅填充 F2,这样用户就无法从 F2 返回到 F10。换句话说,后栈应该变成:
不是这个:F1 -> F7 -> F8 -> F9 -> F10 -> F2
但是这个:F2
我怎样才能做到这一点?
编辑1:
我尝试的解决方案之一是在加载 Activity 时向 navigationView 添加一个 OnNavigationItemSelectedListener
,这将在按下其中一项时清除后台堆栈。我的解决方案有效,但在此过程中我覆盖了实际更改为新 fragment 的默认代码。我窥探了 Android API 并发现了这个:
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
boolean handled = onNavDestinationSelected(item, navController);
if (handled) {
ViewParent parent = navigationView.getParent();
if (parent instanceof DrawerLayout) {
((DrawerLayout) parent).closeDrawer(navigationView);
} else {
BottomSheetBehavior bottomSheetBehavior =
findBottomSheetBehavior(navigationView);
if (bottomSheetBehavior != null) {
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
}
}
}
return handled;
}
});
这不是我的代码。这是处理抽屉导航上菜单项选择的 native 代码(位于 NavigationUI
类中)。如果我想添加自己的 OnNavigationItemSelectedListener
我必须重新创建上面显示的功能,但我无法这样做,因为其中的某些方法受到保护。这就是为什么我不相信这个解决方案会起作用。
最佳答案
您可以尝试清除backstack中的 fragment
FragmentManager manager = getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 0) {
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
关于java - 清除除顶部 fragment 之外的 fragment Backstack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60272198/