java - 清除除顶部 fragment 之外的 fragment Backstack

标签 java android android-fragments fragment-backstack

在我的应用程序中,抽屉导航中有一些菜单项。当用户点击这些项目之一并导航到相应的 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/

相关文章:

没有 Try 和 Catch 的 Java 代码

java - ListView 问题

android - 像 ViewFlipper 一样翻转 ViewPager,可能吗?

Android 设备 onConfigurationChanged 事件不处理方向

java - 如何使用 Xpath 正确地从 XML 传递对象

java - 在java中使用接口(interface)或类型定义变量?

android - 在Android中检索两个不同日期之间的记录

android - View (不是 fragment )的 ViewPager 作为 fragment 中 gridview(Etsy 的 StaggeredGridView)的标题

android - ListFragment 上的 addHeaderView = NullPointerException

java - 单击按钮更改 fragment