Android Fragments:何时使用hide/show或add/remove/replace?

Rob*_*arl 113 android android-fragments

假设我希望将某个容器视图中的当前片段替换为另一个容器视图.使用替换更好吗?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();
Run Code Online (Sandbox Code Playgroud)

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

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();
Run Code Online (Sandbox Code Playgroud)

这种方法更有效率吗?无法找到有关何时使用这些方法的大量信息,或者它们如何影响所涉及碎片的生命周期.谢谢!

小智 129

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

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

  • 根据我们的需要,初始化片段非常昂贵,所以我们可能会使用`hide()`和`show()`来保存它!谢谢你! (5认同)
  • 嗨,当你说从窗口分离时,你的意思是onDetach()回调会被调用吗?我试验过,似乎并非如此. (2认同)

Mar*_*ski 5

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