使用 add() 方法添加片段不会隐藏以前的片段

Posted

技术标签:

【中文标题】使用 add() 方法添加片段不会隐藏以前的片段【英文标题】:Adding a Fragment with add() method doesn't hide previous fragments 【发布时间】:2011-09-07 21:00:53 【问题描述】:

我在使用 add() 方法添加新片段时遇到“意外行为”。

我想在 FrameLayout 上添加一个新片段,但是当我这样做时,前一个片段仍然可见。

这是使用 add() 方法时的预期结果吗?

是因为我用的是FrameLayout,add()方法只是在FrameLayout上放一个fragment,不影响前一个?

谢谢

【问题讨论】:

【参考方案1】:

不是错误。尝试替换(..)。而是根据需要添加到后台堆栈。

编辑我认为使用replaceremove() add() 可以解决您的问题,但是正如您在相关的post 中强调的那样,在您的特定情况下会出现一个错误。

【讨论】:

我就是这样做的,但是后来我发现了这个问题:***.com/questions/6229142/…(用replace()添加的新片段在回栈操作后没有被删除) 好吧,这很奇怪。你能发布一些代码。我正在使用兼容性库,它具有能够调试源代码的额外优势,并且正在执行以下操作以毫无问题地从片段 A 加载片段 B:'getActivity().getSupportedFragmentManager().beingTransaction.replace (R.id.details, fragB).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).addToBackStack(null).commit();' 此外,我建议使用兼容性库创建一个简单的应用程序,看看是否可行。如果没有,则对其进行调试以查看发生了什么。基本上,一个片段有一个与之关联的中间活动,当它被删除时(即返回),它应该设置为 null。在调用 replace() 或 add() 时,中间活动的状态决定片段是否被视为已添加。 因为这是一个不同的主题,所以我将代码放在这里:***.com/questions/6250580/… 如您所见,我已经尝试过替换。我没有使用兼容性库,但可能是进行切换的好时机。我有一个容器活动,你的意思是这个活动在片段转换期间改变了他的状态吗?我的容器 Activity 旨在处理一堆片段,我不希望我的 Activity 被删除或受到后退按钮按下的影响,尽管我决定了。或者你在说什么中间活动?谢谢 我建议在 API 演示中查看 FragmentStack.java 的堆栈示例,看看它与您的代码 link 相比有何不同,因为它完全符合您的要求,也许您不应该保留对片段管理器的引用,但每次都使用 getFragmentManager(),我不知道。关于中间活动,底层的 Fragment 有一个与之关联的活动,当 Fragment 被删除时,它被设置为 null 并在添加时被检查(参见兼容性库源代码)。【参考方案2】:

你可以做的其他简单的事情就是调用

FragmentTransaction t = getFragmentManager.beginTransaction();
t.hide(<your_fragment>);
t.add(<container, <new_fragment>);
..do the rest here..
t.commit();

如果这有帮助,请告诉我。

【讨论】:

以上是关于使用 add() 方法添加片段不会隐藏以前的片段的主要内容,如果未能解决你的问题,请参考以下文章

添加片段后,前一个片段仍然可见

尝试将片段添加到我的片段容器 FrameLayout

尝试将片段添加到我的片段容器 FrameLayout

如何删除使用片段管理器添加的所有片段?

片段生命周期 - 在显示/隐藏时调用哪个方法?

启动片段时隐藏ActionBar