Android Fragment使用小结及介绍
目录(?)[-] 一什么是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&¤tFragment.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使用小结及介绍的更多相关文章
- android Fragment 用法小结
		
Fragment 是android 3.0引入的新API,是作为Activity的子模块,必须嵌入Activity才能使用. Activity 与 Fragment的关系: 一.依附性: 1. Fra ...
 - 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)
		
即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...
 - Android Fragment的介绍与使用(案例Demo)
		
应用场景: 众所了解Android上的界面展示都是通过Activity实现的,可是Activity也有它的局限性,相同的界面在手机上显示可能非常好看,在平板上就未必了.为了让界面能够在平板上更好地展示 ...
 - 【Android自学日记】【转】Android Fragment 真正的完全解析(下)
		
上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...
 - 【Android自学日记】【转】Android Fragment 真正的完全解析(上)
		
自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产 ...
 - Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
		
Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...
 - Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
		
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
 - Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
		
嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...
 - Android Fragment 真正的完全解析(下)
		
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...
 
随机推荐
- Java笔试面试题007
			
Java笔试面试题007 1.请用正則表達式匹配出QQ号(如果QQ号码为5-10位). 解答: ^ \d{5,10}$ 2.String, StringBuffer StringBuilder的差别. ...
 - js加入收藏夹
			
工作需要了解了一下点击加入收藏这个功能 <script> function _addFavorite() { var url = window.location; //获取当前网页网址 v ...
 - Android手机输入法按键监听-dispatchKeyEvent
			
近期在项目开发中遇到一个关于手机输入键盘的坑.特来记录下. 应用场景: 项目中有一个界面是用viewpaper加三个fragment写的,当中viewpaper被我屏蔽了左右滑动,上面有三个点击按钮, ...
 - JSP简明教程:汇总
			
原创JSP教程,简洁明了,不含废话. JSP简明教程(一):JSP简单介绍 JSP简明教程(二):JSP基本的语法 JSP简明教程(三):JSP隐含对象 JSP简明教程(四):EL表达式语言.Java ...
 - 线程相关函数(POSIX线程):
			
创建单个线程 #include <pthread.h> // 若成功返回0,出错返回正的Exxx值 int pthread_create(pthread_t *tid, // 每个线程在进 ...
 - 白帽子讲web安全读后感
			
又是厚厚的一本书,为了不弄虚做假,只得变更计划,这一次调整为读前三章,安全世界观,浏览器安全和xss.其它待用到时再专门深入学习. 吴翰清是本书作者,icon是一个刺字,圈内人称道哥.曾供职于阿里,后 ...
 - Axure Base 01
			
名词解释: 线框图:一般就是指产品原型,比如:把线框图尽快画出来和把原型尽快做出来是一个意思. axure元件:也叫axure组件或axure部件,系统自带了一部分最基础常用的,网上也有很多别人做好的 ...
 - VC++ 对话框下使用工具栏
			
关于这一技术网上也有很多的记录,下面仅记录我测试OK的代码. 在CXXDlg.h中添加如下成员变量: CToolBar m_ToolBar; CBitmap m_bmpTool; 在CXXDlg ...
 - ios常用到的第三方库
			
在iOS开发中不可避免的会用到一些第三方类库,它们提供了很多实用的功能,使我们的开发变得更有效率:同时,也可以从它们的源代码中学习到很多有用的东西. Reachability 检测网络连接 用来检查网 ...
 - Fastreport生成WEB报表
			
开发WEB应用系统通常都会遇到报表打印问题.简单应用可利用IE的页面打印功能,利用HTML标签控制格式来实现.但复杂的业务型应用系统,报表不仅是组成应用的 重要部分,还常常是相当复杂的.现在很多应用系 ...