-
当前Activity同一个容器只添加一个Fragment时add和replace效果是一样的。
-
当前Activity添加了一个FragmentA后,在后续某个操作中要将这个FragmentA替换为另外一个FragmentB时,有两种情况:
- 如果
FragmentA
时通过add添加的,在将FragmentA
替换为FragmentB
时,可以通过hideFragmentA
,addFragmentB
showFragmentB
- 如果
FragmentA
通过replace操作添加的,在将FragmentA
替换为FragmentB
时,使用replace替换
- 通过 add 添加的
Fragments
,可以由开发者自由控制当前应该显示哪个Fragment,以及隐藏哪个Fragment,其实在源码中就是对应Fragment中View的显示和隐藏。 - 通过replace 添加 的 Fragment,当前已存在的Fragment被替换时走生命周期销毁流程,传递给replace方法的Fragment走生命周期创建流程。
- 根据以上结论,我们可以得到一个实例开发中添加Fragment时很重要的一个结论
- 当Fragment不可见时,如果你要保留Fragment中的数据以及View的显示状态,那么可以使用add操作,后续中针对不同的状态隐藏和显示不同的Fragment。
- 优点:快,知识Fragment中View的显示和隐藏
- 缺点:内存中保留的数据太多,容易导致造成OOM的风险。
- 当Fragment不可见时,你不需要保留Fragment中的数据以及View的显示状态,那么可以使用replace。
- 优点:节省内存,不需要的数据能立即释放掉
- 缺点:频繁创建Fragment,也就是频繁走Fragment生命周期创建和销毁流程,造成性能开销。
- 然后分别对进行一个add和replace事物操作时,源码中是如何处理的。
要对add和replace事务操作源码中是如何处理的,那么先看下对Fragment事务操作提交流程。
简要流程图