片段行为:FragmentTransaction::replace() 和反向 backStack 操作

Posted

技术标签:

【中文标题】片段行为:FragmentTransaction::replace() 和反向 backStack 操作【英文标题】:Fragments behaviour: FragmentTransaction::replace() and reverse backStack operation 【发布时间】:2011-09-07 22:03:52 【问题描述】:

我调用这个方法从 AFrag 前进到 BFrag:

showFragment()
 
    FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();

    // Add fragment to the container ContentView 
    fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag, mBFrag.getTag());

    // Add FADE effect
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);   

    // Keep the transaction in the back stack so it will be reversed when backbutton is pressed
    fragmentTransaction.addToBackStack(null);

    // Commit transaction
    fragmentTransaction.commit();

它显示一个新片段 (BFrag),替换前一个片段 (AFrag) 并保留有关交易的信息,因此可以在按下后退按钮时自动撤消/撤消。

当按下后退按钮时,一切看起来都很好,显示前一个片段(AFrag)。但是当我再次前进时(AFrag -> BFrag)我得到一个“片段已添加异常”。

反向/撤消操作没有删除新片段(BFrag)吗?这是预期的行为吗?

这很奇怪,因为在这之后,我决定设置一个检查:

 if(mBFrag.isAdded()) 
 
    fragmentTransaction.show(mBFrag);
 
 else 
 
   fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag, mBFrag.getTag());
 

静止不动,它进入 else 语句......我得到了例外。

请了解我做错了什么?

谢谢。

【问题讨论】:

【参考方案1】:

您是否尝试过使用其他方法,例如 remove(),然后执行 add()。或类似的东西?我在其他帖子中看到 replace() 方法并不总是正确的。

【讨论】:

是的,你所说的答案和另一篇文章是我的朋友 xD ***.com/questions/6250580/…Thx 反正 我很高兴听到这个消息,我只是想知道我的代码出错了,一​​如既往。谢谢你的澄清。

以上是关于片段行为:FragmentTransaction::replace() 和反向 backStack 操作的主要内容,如果未能解决你的问题,请参考以下文章

FragmentTransaction.replace() 淡入过渡显示“幽灵”片段

使用 FragmentTransaction 将数据发送到片段

当我使用 fragmentTransaction.add 方法时片段重叠

为啥要使用 FrameLayout 作为 FragmentTransaction 的片段容器? [复制]

片段 popbackstack 行为在 25.1.0 和 25.1.1 中被破坏

如何实现 FragmentManager 和 FragmentTransaction 来替换单个片段?