笔沫

有梦为马,随处可栖

  • 主页
  • 技术
  • 随想
  • 音乐
所有文章 其他

笔沫

有梦为马,随处可栖

  • 主页
  • 技术
  • 随想
  • 音乐

Android Fragment使用小结及介绍

2017-11-10

偶记得第一次接触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的获取:

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

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

i.添加代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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查找是否存在,然后再添加

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

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

1
2
3
4
5
6
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方式
这里写图片描述

由以上两图知:replace方式内存波动比较大,网络请求消耗大;add方式则反之。

赏

感谢认可,么么哒

支付宝
微信
  • 技术
  • Android
  • Fragment

扫一扫,分享到微信

微信分享二维码
LeakCanary框架源码解析
Android悬浮窗原理解析
© 2019 笔沫
Hexo Theme Yilia by Litten
  • 所有文章
  • 其他

tag:

  • 技术
  • Android
  • Activity的启动模式
  • Android注解
  • Java反射机制
  • Java动态代理
  • Android基础
  • MVP
  • NDK
  • JNI C/C++
  • 开源框架
  • AS Gradle优化
  • 博客搭建
  • 设计模式
  • Fragment
  • Rxjava
  • Rxandroid
  • 响应式编程
  • 随想
  • 你本是一个肉体,是什么驱使你前行
  • 原创
  • 笔沫拾光
  • Java
  • Java基础
  • 王阳明心学
  • 中国历史
  • 人生的意义
  • 演讲
  • 执着的人是幸福的
  • 郭川
  • Android框架源码解析
  • 加解密算法
  • Binder通信机制
  • 开源框架源码解析
  • LeakCanary框架源码分析
  • Java集合类
  • 转载
  • Http文件断点续传
  • Logger框架源码解析
  • Android应用程序入口源码解析
  • DecorView绘制流程
  • Android消息机制源码解析
  • Activity启动流程
  • Butterknife框架源码解析
  • 我之存在,因为有你
  • 霍华德*舒尔茨
  • Android相机
  • Camera
  • 悬浮窗
  • WindowManager

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 风光摄影
  • 星空摄影
  • 人像摄影
  • 学习站点