首先获取FragmentTransaction对象:FragmentTransaction transaction = getFragmentManager().beginTransaction();

两种方法不同之处是否要清空容器再添加fragment的区别,用法上add配合hide或是remove使用,replace一般单独出现。

添加

一般会配合hide使用:transaction.add(R.id.fragment_container, oneFragment).hide(twoFragment).commit();

1.第一个参数是容器id, 第二个参数是要添加的fragment,添加不会清空容器中的内容,不停的往里面添加

2.不允许添加同一个fragment实例,这是非常重要的特点。如果一个fragment已经进来的话,再次添加的话会报异常错误的。

3.添加进来的fragment都是可见的(visible),后添加的fragment会展示在先添加的fragment上面,在绘制界面的时候会绘制所有可见的view

4.所以大多数add都是和hide或者是remove同时使用的。这样可以节省绘制界面的时间,节省内存消耗,是推荐的用法。

替换

transaction.replace(R.id.fragment_container, oneFragment).commit();

1.替换会把容器中的所有内容全都替换掉,有一些app会使用这样的做法,保持只有一个fragment在显示,减少了界面的层级关系。

相同之处:每次add和replace都要走一遍fragment 的周期。

 其实fragment一般不会这么简单使用,replace的使用场景一般不多,大多数是添加(add)和显示(show)配合隐藏(hide)来使用,这样首先避免相同类型的fragment的重复添加,提示开发者使用单例模式,已经添加过的fragment很多情况没有必要再次添加,而且还有把生命周期再走一遍,这是一种比较浪费的做法

 

最合适的处理方式是这样的:

1.在add的时候,加上一个tab参数
transaction.add(R.id.content, IndexFragment,”Tab1″);
2.然后当IndexFragment引用被回收置空的话,先通过
IndexFragment=FragmentManager.findFragmentByTag(“Tab1″);
找到对应的引用,然后继续上面的hide,show;

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐