Android:如何从返回栈中移除片段?

4

我有一个情况,需要清除回退栈中除了当前可见的那个片段之外的所有片段(即位于顶部的片段)。

例如,回退栈中有四个片段 A->B->C->D(D 位于顶部)。

现在我想从回退栈中删除片段 A、B、C。但是约束条件是在从回退栈中删除历史记录时,不应该对片段 D 产生任何可见影响。

这是我的代码。

FragmentManager fm = getActivity().getSupportFragmentManager();
                Bundle bundle = new Bundle();
                OrderReceiptFragment orderReceiptFragment = new OrderReceiptFragment();
                bundle.putSerializable("orderHistory", orderHistory);
                orderReceiptFragment.setArguments(bundle);
                CommonUtil.clearBackstack(fm);
                fm.beginTransaction().setCustomAnimations(R.anim.enter_from_left,
                        R.anim.exit_to_right)
                        .replace(R.id.container, orderReceiptFragment).commit();

清除回退栈的方法
public static void clearBackstack(FragmentManager fragmentManager) {    
    fragmentManager.popBackStack(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

问题在于,当清除后退栈时,有些毫秒数内来自后退栈的第一个片段会变得可见。这看起来很奇怪。是否有人有解决方案?

5个回答

5

你可以这样做

方法1:逐个删除

 FragmentManager fm = getActivity().getSupportFragmentManager();
      for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
      fm.popBackStack();
}

方法二

 FragmentManager fm = getActivity().getSupportFragmentManager();
fm .popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) 

参考

看这个答案。你可以找到不同的方法

还可参考popBackStackImmediate


你尝试过不同的方法吗?这些是常用的清除后退栈的方法。首先,你尝试了这个方法吗? - edwin

2

这样怎么样?

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) 

1

试一下这段代码:

 FragmentManager _manager = getActivity().getSupportFragmentManager();
_manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) 

我知道这种方法并且目前正在使用,但在启动片段D之前,用户可以看到效果,即在片段D开始之前,片段A可见一毫秒。这看起来很奇怪。 - Abhishek Akhani

-1
如果您想让历史记录中任何时候只有当前正在查看的布局,您可以在清单文件中执行以下操作:
android:noHistory="true"

将此代码放入每个您不想在历史记录中显示的片段/活动中。

-1

非常简单:

FragmentManager frgManager;
frgManager = getActivity().getSupportFragmentManager();
frgManager.popBackStack("null", FragmentManager.POP_BACK_STACK_INCLUSIVE);

为什么你把第一个参数设为'0'而不是'null'?有特别的原因吗? - Ramakishna Balla
没有特别的原因...它能够完成工作,但效果如我在问题中所述...这是我的客户不喜欢的... - Abhishek Akhani
任何片段的“弹出” - 无论您使用哪个片段管理器 - 都会使它们在短时间内“复活”(它们会像用户通过“返回”按钮一样被退回)。这根本没有回答问题。 - Den Drobiazko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接