目录(?)[-]

一什么是Fragment
二Fragment的生命周期
三Fragment的两种添加方式addreplace
四两种添加方式性能比较

偶记得第一次接触Fragment,觉得好牛叉的组件,可以做许多Activity可以做的事,辅助Activity让功能可以做得更加强大;一次编写,可以多个地方可以使用,解放了Activity。在这里,本篇文章主要是总结fragment的两种添加方式,add和replace。

一、什么是Fragment

简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。

使用Fragment还有这么几个方面优势:

  • 代码复用。特别适用于模块化的开发,因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了,是模块化UI的良好组件。
  • Activity用来管理Fragment。Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。
  • 可控性。Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。
  • Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。

二、Fragment的生命周期

Fragment的生命周期类似Activity,如下图,Activity生命周期与Fragment生命周期对比图:

三、Fragment的两种添加方式(add&replace)

Fragment添加与FragmentManager与FragmentTransaction息息相关。add和replace都是FragmentTransaction的方法。除这两个方法,其中还有remove,hide和show方法。

FragmentManager与FragmentTransaction的获取:

FragmentManager frgmentManager = getFragmentManager() // v4中,getSupportFragmentManager
FragmentTransaction transaction = frgmentManager.benginTransatcion();

1.项目中多个Fragment,add方式添加

i.添加代码

 public void add(BaseLibFragment fragment, int id,String tag){
FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//优先检查,fragment是否存在,避免重叠
BaseLibFragment tempFragment = (BaseLibFragment)fragmentManager.findFragmentByTag(tag);
if(EmptyUtils.isNotEmpty(tempFragment)){
fragment = tempFragment;
}
if(fragment.isAdded()){
addOrShowFragment(fragmentTransaction,fragment,id,tag);
}else{
if(currentFragment!=null&&currentFragment.isAdded()){
fragmentTransaction.hide(currentFragment).add(id, fragment,tag).commit();
}else{
fragmentTransaction.add(id, fragment,tag).commit();
}
currentFragment = fragment;
}
}
/**
* 添加或者显示 fragment
*
* @param fragment
*/
private void addOrShowFragment(FragmentTransaction transaction, BaseLibFragment fragment, int id,String tag) {
if(currentFragment == fragment)
return;
if (!fragment.isAdded()) { // 如果当前fragment未被添加,则添加到Fragment管理器中
transaction.hide(currentFragment).add(id, fragment,tag).commit();
} else {
transaction.hide(currentFragment).show(fragment).commit();
}
currentFragment.setUserVisibleHint(false);
currentFragment = fragment;
currentFragment.setUserVisibleHint(true);
}

ii.添加顺序

  • 第一次添加,先hide(隐藏)currentFragment,再add(添加)新Fragment。生命周期会按正常流程走,onCreate->onResume
  • 第二次添加,先hide(隐藏)currentFragment,在show(显示)老Fragment。生命周期不会重新走,会调用onHiddenChanged(),展示fragment的显示状态,我们可以在此做一些刷新数据操作。

iii.add方式Fragment重叠BUG解决方案 
为fragment设置Tag,通过findFragmentByTag查找是否存在,然后再添加

 //优先检查,fragment是否存在,避免重叠
BaseLibFragment tempFragment = (BaseLibFragment)fragmentManager.findFragmentByTag(tag);
if(EmptyUtils.isNotEmpty(tempFragment)){
fragment = tempFragment;
}

2.项目中多个Fragment,replace方式添加 
i.添加代码

 public void replace(BaseLibFragment fragment, int id){
FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(id, fragment);
fragmentTransaction.commit();
}

ii.添加方式 
添加方式比较直接,直接替换。在这过程中因为是替换,第一和第二次添加没啥区别,生命周期都要重新执行一次

四、两种添加方式性能比较

标准的四大金刚模式。底部四个Item,通过Fragment内容切换,此种方式add与replace性能对比,如下两图:

add方式

replace方式

Android Fragment使用小结及介绍的更多相关文章

  1. android Fragment 用法小结

    Fragment 是android 3.0引入的新API,是作为Activity的子模块,必须嵌入Activity才能使用. Activity 与 Fragment的关系: 一.依附性: 1. Fra ...

  2. 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)

    即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...

  3. Android Fragment的介绍与使用(案例Demo)

    应用场景: 众所了解Android上的界面展示都是通过Activity实现的,可是Activity也有它的局限性,相同的界面在手机上显示可能非常好看,在平板上就未必了.为了让界面能够在平板上更好地展示 ...

  4. 【Android自学日记】【转】Android Fragment 真正的完全解析(下)

    上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...

  5. 【Android自学日记】【转】Android Fragment 真正的完全解析(上)

    自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产 ...

  6. Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理

    Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...

  7. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  8. Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误

    嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...

  9. Android Fragment 真正的完全解析(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

随机推荐

  1. PAT 1003 Sharing (25)

    题目描写叙述 To store English words, one method is to use linked lists and store a word letter by letter. ...

  2. 华夏互联总经理汪照发接受程序猿杂志专訪-2014年6月江西IDC排行榜

     作为软件开发界最权威的期刊,<程序猿>杂志一直是业界推崇的高端读物,能被其採訪是极大的荣耀. 上个月,作为江西省内的排名第一的站点开发企业和专业的站点研发厂商,Zoomla!逐浪CM ...

  3. CloudStack系统虚拟机启动但不在Host表中

    有网友问到这个问题,CloudStack中,系统虚拟机正常启动,Running状态. 可是在host表中没有对应项,上传下载模板等功能也不正常. 原因:系统虚拟机启动之后,会通过管理网段主动连接man ...

  4. PandoraBox 支持3G无线上网卡(联通卡3G卡)(一)

    一:笔者采用的是系统是OpenWrt之PandoraBox,内核版本3.3.8:硬件设备是MTK的7620开发板. 其中怎么搭建openwrt开发环境在此不用多说,因为既然想实现3G无线上网卡拨号上网 ...

  5. 【iOS系列】-自定义Modar动画

    [iOS系列]-自定义Modar动画.md 我们需要做的最终的modar动画的效果是这样的, 就是点击cell,cell发生位移,慢慢的到第二个界面上的.为了做出这样的动画效果,我们需要以下的知识. ...

  6. git常用知识笔记

    学习资料: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 http://codi ...

  7. hdfs 3种 通讯协议

    http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html 通讯协议 所有的HDFS通讯协议都是建立在TCP/IP协议之上.客户端通过一个可配置的 ...

  8. SAP图标- ICON

  9. MapReduce Join的使用

    一.Map端Join 可连接两个都非常大的数据集之间可使用map端连接,数据在到达map端之前就执行连接操作. 需满足: 两个要连接的数据集都先划分成相同数量的分区,相同的key要保证在同一分区中(每 ...

  10. manacher求最长回文子串算法模板

    #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> ...