123

假设我希望将某个容器视图中的当前片段替换为另一个。是不是用替换...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

...或以下,显示和隐藏?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

这样做的一种方法是否更有效?找不到有关何时使用这些方法或它们如何影响所涉及片段的生命周期的太多信息。谢谢!

4

4 回答 4

144

您应该考虑您计划对片段执行的操作,以决定遵循哪条路径。如果你使用 FragmentTransaction 来隐藏 Fragment,那么它仍然可以处于其生命周期的运行状态,但它的 UI 已经与窗口分离,因此不再可见。因此,从技术上讲,您仍然可以与片段交互,并在以后需要时重新附加其 UI。如果您替换片段,您实际上是将其从容器中拉出,它将经历生命周期中的所有拆卸事件(onPause、onStop 等),如果由于某种原因您再次需要该片段,您将不得不将其重新插入容器并让它再次运行所有初始化。

如果您很有可能再次需要该片段,那么只需隐藏它,因为重绘它的布局比完全重新初始化它的操作成本更低。

于 2012-11-01T20:32:39.630 回答
5

你基本上是自己回答的。如果您想替换(不再需要旧片段)replace(),如果您想暂时隐藏它,请使用hide().

于 2012-10-31T00:47:30.867 回答
0

我在我的活动中使用了带有 4 个片段的隐藏/显示方法,它解决了我的解决方案,但是当我显示我的对话框时随机出现一段时间,当我使用添加和替换方法时,它会给出窗口错误令牌异常,然后不会发生错误令牌异常,所以我认为显示/隐藏方法并不完美

于 2018-12-25T05:24:29.437 回答
0

如果视图“重”,我认为应该使用隐藏/显示。有这样的回调:onHiddenChanged。如果您使用隐藏/显示,那将很有帮助。

于 2021-06-25T06:57:34.740 回答