如何清除fragmentManager的后退栈而不弹出片段?

6

一个简单的问题却似乎无法回答... 如何清除fragmentManager的回退栈而不弹出片段?

我理解它是这样的:

回退栈条目 = 具有addToBackStack命令的事先保存的交易列表。例如:“用Fragment 2替换Fragment 1”。

popBackStack = 做最后一个保存的事务的反向操作。例如:“用Fragment 1替换Fragment 2”。

假设我做了第一笔交易:F1->F2,并将此交易添加到回退栈中。现在当我按下返回按钮时,F2->F1 将会发生。

好了...但是...

我改变了主意,我想清除回退栈。 我希望用户使用F2片段,但当他/她按下返回按钮时,活动应该像回退栈为空一样关闭。

我需要这样的东西:

for(int i=0;i<getFragmentManager().getBackStackEntryCount();i++){
    getFragmentManager().getBackStackEntryAt(i).remove();
}

编辑过的内容 我尝试将简单的问题提出到复杂的情况中,但却得到了简单的答案;) Abhishek Patel的回答非常好,但不是我想要的。不过这仍然是一个很好的答案。

澄清一下: 在Android中,“返回栈”不是像以下完全可编辑的列表:

  • transaction 1
  • transaction 2
  • transaction 3
  • transaction 4

我们无法执行“删除transaction 3”以获得:

  • transaction 1
  • transaction 2
  • transaction 4

我们不能清除所有返回栈并保留最后一个可见片段。

我们可以删除返回栈记录到特定位置,例如:“删除Transaction 2之前的所有内容”,以获得:

  • transaction 1
  • transaction 2

在屏幕上,您将看到Transaction 2的效果。

为什么我需要这个?

我认为我可以创建一个片段,它将成为“主要片段”。这个主要片段将使用接口告诉它所在的任何活动,这个老板片段现在正在显示,并且发生在其之前的所有事情都不再重要。

(F)- 片段,(A)- 活动

(F)- 嘿,伙计。我是老板,我是可见的并附加到你身上。请为我清除您的返回栈,但保留带我到这里的事务。

(A)- 对不起,伙计...你应该在执行事务以清除我的返回栈之前告诉我,这样我就可以将你的事务添加到全新的返回栈顶部。


https://dev59.com/R2025IYBdhLWcg3wKCb- - Mstack
1个回答

11

这可能会有帮助:

public void clearBackStack() {
    BackStackEntry entry = getSupportFragmentManager().getBackStackEntryAt(0);
    getSupportFragmentManager().popBackStack(
            entry.getId(),
            FragmentManager.POP_BACK_STACK_INCLUSIVE);
    getSupportFragmentManager().executePendingTransactions();

}

我之前找到过,但并不完全符合我的需求。我认为后退堆栈就像一个列表,我可以删除任何我想要的行... - Daniel Więcek

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