假设我希望将某个容器视图中的当前片段替换为另一个容器视图。使用替换更好......
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();
提高效率的一种方法是什么?无法找到有关何时使用这些方法的大量信息,或者它们如何影响所涉及碎片的生命周期。 谢谢!
答案 0 :(得分:124)
您应该考虑您打算如何处理片段以确定要遵循的路径。如果您使用FragmentTransaction来隐藏片段,那么它仍然可以处于其生命周期的运行状态,但是它的UI已经从窗口中分离出来,因此它不再可见。因此,您可以在技术上仍然与片段进行交互,并在以后需要时重新附加其UI。如果你替换了片段,你实际上是将它从容器中拉出来,它将经历生命周期中的所有拆解事件(onPause,onStop等),如果由于某种原因你再次需要那个片段,你将不得不将其插回到容器中,让它再次运行所有初始化。
如果您很有可能再次需要该片段,那么只需隐藏它,因为重绘它的布局比完全重新初始化它更便宜。
答案 1 :(得分:5)
你基本上回答了自己。如果您想要替换(不再需要旧片段),请使用replace()
如果您想暂时隐藏它,请执行hide()
。
答案 2 :(得分:0)
我在我的活动中使用了hide / Show方法,其中有4个片段解决了我的问题,但是当我显示我的对话框时,它随机出现了一段时间,当我使用add和replace方法时,它给出了窗口错误的令牌异常,因此不会发生错误的令牌异常,所以我认为显示/隐藏方法并不完美
答案 3 :(得分:0)
如果视图“重”,我认为应该使用隐藏/显示。有这样的回调:onHiddenChanged。如果您使用隐藏/显示它会有所帮助。