标签:二次 加强 nsa ext context 方式 target 传递 操作
目录(?)[-]
一什么是Fragment
二Fragment的生命周期
三Fragment的两种添加方式addreplace
四两种添加方式性能比较
偶记得第一次接触Fragment,觉得好牛叉的组件,可以做许多Activity可以做的事,辅助Activity让功能可以做得更加强大;一次编写,可以多个地方可以使用,解放了Activity。在这里,本篇文章主要是总结fragment的两种添加方式,add和replace。
简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。
使用Fragment还有这么几个方面优势:
Fragment的生命周期类似Activity,如下图,Activity生命周期与Fragment生命周期对比图:
Fragment添加与FragmentManager与FragmentTransaction息息相关。add和replace都是FragmentTransaction的方法。除这两个方法,其中还有remove,hide和show方法。
FragmentManager与FragmentTransaction的获取:
FragmentManager frgmentManager = getFragmentManager() // v4中,getSupportFragmentManager FragmentTransaction transaction = frgmentManager.benginTransatcion();
1.项目中多个Fragment,add方式添加
i.添加代码
1 public void add(BaseLibFragment fragment, int id,String tag){ 2 FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager(); 3 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 4 //优先检查,fragment是否存在,避免重叠 5 BaseLibFragment tempFragment = (BaseLibFragment)fragmentManager.findFragmentByTag(tag); 6 if(EmptyUtils.isNotEmpty(tempFragment)){ 7 fragment = tempFragment; 8 } 9 if(fragment.isAdded()){ 10 addOrShowFragment(fragmentTransaction,fragment,id,tag); 11 }else{ 12 if(currentFragment!=null&¤tFragment.isAdded()){ 13 fragmentTransaction.hide(currentFragment).add(id, fragment,tag).commit(); 14 }else{ 15 fragmentTransaction.add(id, fragment,tag).commit(); 16 } 17 currentFragment = fragment; 18 } 19 } 20 /** 21 * 添加或者显示 fragment 22 * 23 * @param fragment 24 */ 25 private void addOrShowFragment(FragmentTransaction transaction, BaseLibFragment fragment, int id,String tag) { 26 if(currentFragment == fragment) 27 return; 28 if (!fragment.isAdded()) { // 如果当前fragment未被添加,则添加到Fragment管理器中 29 transaction.hide(currentFragment).add(id, fragment,tag).commit(); 30 } else { 31 transaction.hide(currentFragment).show(fragment).commit(); 32 } 33 currentFragment.setUserVisibleHint(false); 34 currentFragment = fragment; 35 currentFragment.setUserVisibleHint(true); 36 }
ii.添加顺序
iii.add方式Fragment重叠BUG解决方案
为fragment设置Tag,通过findFragmentByTag查找是否存在,然后再添加
1 //优先检查,fragment是否存在,避免重叠 2 BaseLibFragment tempFragment = (BaseLibFragment)fragmentManager.findFragmentByTag(tag); 3 if(EmptyUtils.isNotEmpty(tempFragment)){ 4 fragment = tempFragment; 5 }
2.项目中多个Fragment,replace方式添加
i.添加代码
1 public void replace(BaseLibFragment fragment, int id){ 2 FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager(); 3 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 4 fragmentTransaction.replace(id, fragment); 5 fragmentTransaction.commit(); 6 }
ii.添加方式
添加方式比较直接,直接替换。在这过程中因为是替换,第一和第二次添加没啥区别,生命周期都要重新执行一次
标准的四大金刚模式。底部四个Item,通过Fragment内容切换,此种方式add与replace性能对比,如下两图:
add方式
replace方式
标签:二次 加强 nsa ext context 方式 target 传递 操作
原文地址:https://www.cnblogs.com/edensyd/p/8819402.html