Fragment 本质探究

在 google 设计角度来看,Fragment 是 Activity 的片段,所以 Fragment 和 Activity 一样是 Framework 提供给我们的对象的容器,唯独不同的是 Activity 是应用程序组件,由 Framework 创建对象并管理对象的生存周期,Fragment不是系统组件,由我们自己创建并管理对象。
作为容器 Fragment 主要容纳两种对象:

  1. View 类对象
  2. 和 View 相关的数据对象

当然我认为 view 相关的数据对象一般可以放在全局的数据类中集中管理。因为是对象的容器,所以 fragment 通常还作为 view 的控制器使用。

fragment 本质

如果你想要把一个 Activity 中 view 树的部分子树分割开来,进行复用,在没有 fragment 的时候,你只能把和这部分子树有关的控制逻辑和子树view相关的数据对象,都放到 viewgroup 里面。为复用这部分 view 子树复用 viewgroup 就行。如果有多种这种 view 子树,并且这些 view 子树会随着程序的逻辑进行替换并还支持回退,那么你可能还需要进行子树替换过程的栈的管理。为了方便使用,android 3.0 以后就把这种需求从 view 视图中分割出来。view 只负责视图展示和交互,不负责程序逻辑,而程序子逻辑和子树替换过程的栈的管理就抽象到 fragment 中,称为 Activity 的片段。

  1. fragment 提供了 View 类对象的容器,可以保存 view 子树,并且可以把 view 子树和主 view 树连接在一起。fragment 是通过 onCreateView() 方法创建 view 子树的。
  2. fragment 提供了 view 类相关数据的容器,可以把 view 类相关数据对象设计为 fragment 的成员。
  3. fragment 提供了控制器的功能,view 子树相关的程序控制逻辑,都可以放在 fragment 中。
  4. FragmentTransaction 提供的 add、remove、replace 等方法本质上都是对 fragment 中的子 view 树进行操作。add 是把子view树添加到fragment的容器viewgroup中,remove 是把子view树从fragment的容器viewgroup中移出,replace 是先把之前的fragment的view树从容器viewgroup中移出,再把新的 fragment 的view树添加到fragment的容器viewgroup中。

fragment 的使用步骤

  1. 创建 Fragment 子类继承 Fragment 类,重写 onCreateView 方法,返回 Fragment 关联的 view子树
  2. 在 Activity 中使用 getFagmentManager 获取到 FragmentManager 对象
  3. 使用 FragmentManager 对象开启 fragment 操作事务
  4. 使用 FragmentTransaction 对象进行 fragment 的 add、replace、remove 操作
  5. (可选)添加事务到后退栈
  6. 提交事务
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment1 fragment = new Fragment1();
fragmentTransaction.add(R.id.container, fragment, "fragmentA");
fragmentTransaction.addToBackStack("test");
fragmentTransaction.commit();

fragment 生命周期函数

fragment 事务提交后
1. 被 add 的 fragment 的生命周期的方法调用顺序为:
onCreate->onCreateView->onStart->onResume
2. 被 remove 的 fragment 的生命周期的方法调用顺序为:
onpause->onStop->onDestroyView
如果这个 fragment 没有添加到回退栈,那么还会调用 onDestroy

fragment 相关类关系

和 Fragment 关系特别密切的类有 Fragment、FragmentManager、FragmentManagerImpl、FragmentTransaction、BackStackRecord、View、Activity

未完待续。。。

fragment 测试 demo 源码

demo下载地址

参考文档

  1. 博文《让多个Fragment 切换时不重新实例化》
  2. android 开发者参考手册 fragment
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值