Fragment切换replace和(add-hide-show)

Fragment的切换中有两种方式----

方式1使用replace直接切换;

方式2使用add先添加Fragment,然后再使用hide隐藏不显示的Fragment,最后再用show将需要显示的Fragment显示出来

下面将介绍下这两种方式:

方式1:使用replace

 使用replace切换Fragment的代码如下:

FragmentManager fm = getSupportFragmentManager();

FragmentTransaction ft = fm.beginTransaction();

ft.replace(R.id.fragment_container,baseFragment);

ft.commit();

方式2:使用add-hide-show

使用add-hide-show代码如下

FragmentManagerfm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
BaseFragment bf = (BaseFragment) fm.findFragmentById(R.id.fragment_container);
if(bf==null||bf!=baseFragment){
    ft.add(R.id.fragment_container,baseFragment);
}
List ls = fm.getFragments();
if(ls!=null){
     for(Fragment f:ls){
        ft.hide(f);
     }
}
ft.show(baseFragment);
ft.commit();

两种方式对比

  • 通过 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生命周期创建和销毁流程,造成性能开销。

从源码角度回答


1. 如果当前Activity同一个id还没有添加Fragment,replace操作和add操作一样。
即执行两者操作生命周期变化:onAttach->onCreate->onCreateView->onActivityCreated->onStart-onResume,
Fragment所依附的Activity销毁时,执行onPause->onStop->onDestoryView->onDestory->onDetach
2. 如果当前Activity同一个id存在Fragment,replace传递的Fragment实例和已存在的Fragment实例一样,replace无效果。
3. 如果当前Activity同一个id存在Fragment,replace传递的Fragment实例和已存在的Fragment实例不一样,replace操作会转换为 remove和add操作,即删除旧的Fragment,添加新的Fragment。
旧的Fragment执行 onPause->onStop->onDestoryView->onDestory->onDetach
新的Fragment执行 onAttach->onCreate->onCreateView->onActivityCreated->onStart-onResume

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值