Fragment的添加和替换的不同

上一篇有提到一个知识点:

transaction.commit();
transaction.commitAllowingStateLoss();
 
 
  • 1
  • 2
  • 1
  • 2

先提前说明:两者都可以提交fragment的操作,唯一的不同是第二种方法,允许丢失一些界面的状态和信息,几乎所有的开发者都遇到过这样的错误:无法在activity调用了onSaveInstanceState之后再执行commit(),这种异常时可以理解的,界面被系统回收(界面已经不存在),为了在下次打开的时候恢复原来的样子,系统为我们保存界面的所有状态,这个时候我们再去修改界面理论上肯定是不允许的,所以为了避免这种异常,要使用第二种方法。

前面两篇文章简单的介绍了Fragment的简单用法,这一篇准备介绍一下常用的Fragment的添加和替换有什么不同。

添加和替换,是最常用的两个方法,从字面的意思上看能够非常明确的理解,添加就是往容器中添加(add),替换(replace)则是把容器清空再添加,也就是把容器中的所有内容都替换掉。

首先获取FragmentTransaction对象:

FragmentTransaction transaction = fm.beginTransaction();
 
 
  • 1
  • 1

添加

transaction.add(R.id.fragment_container, oneFragment).commit();
 
 
  • 1
  • 1

第一个参数是容器id, 第二个参数是要添加的fragment,添加不会清空容器中的内容,不停的往里面添加,值得强调的是,如果一个fragment已经进来的话,再次添加的话会报异常错误的,不重复添加同一fragment,这是非常重要的特点。

添加进来的fragment都是可见的(visible),后添加的fragment会展示在先添加的fragment上面,在绘制界面的时候会绘制所有可见的view,所以大多数add都是和hide或者是remove同时使用的,例如:

transaction.add(R.id.fragment_container, oneFragment).hide(twoFragment)commit();
 
 
  • 1
  • 1

这样可以节省绘制界面的时间,节省内存消耗,是推荐的用法。

替换

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

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

不同之处

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

相同之处

每次add和replace都要重新走一遍fragment 的周期。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值