在 google 设计角度来看,Fragment 是 Activity 的片段,所以 Fragment 和 Activity 一样是 Framework 提供给我们的对象的容器,唯独不同的是 Activity 是应用程序组件,由 Framework 创建对象并管理对象的生存周期,Fragment不是系统组件,由我们自己创建并管理对象。
作为容器 Fragment 主要容纳两种对象:
- View 类对象
- 和 View 相关的数据对象
当然我认为 view 相关的数据对象一般可以放在全局的数据类中集中管理。因为是对象的容器,所以 fragment 通常还作为 view 的控制器使用。
fragment 本质
如果你想要把一个 Activity 中 view 树的部分子树分割开来,进行复用,在没有 fragment 的时候,你只能把和这部分子树有关的控制逻辑和子树view相关的数据对象,都放到 viewgroup 里面。为复用这部分 view 子树复用 viewgroup 就行。如果有多种这种 view 子树,并且这些 view 子树会随着程序的逻辑进行替换并还支持回退,那么你可能还需要进行子树替换过程的栈的管理。为了方便使用,android 3.0 以后就把这种需求从 view 视图中分割出来。view 只负责视图展示和交互,不负责程序逻辑,而程序子逻辑和子树替换过程的栈的管理就抽象到 fragment 中,称为 Activity 的片段。
- fragment 提供了 View 类对象的容器,可以保存 view 子树,并且可以把 view 子树和主 view 树连接在一起。fragment 是通过 onCreateView() 方法创建 view 子树的。
- fragment 提供了 view 类相关数据的容器,可以把 view 类相关数据对象设计为 fragment 的成员。
- fragment 提供了控制器的功能,view 子树相关的程序控制逻辑,都可以放在 fragment 中。
- FragmentTransaction 提供的 add、remove、replace 等方法本质上都是对 fragment 中的子 view 树进行操作。add 是把子view树添加到fragment的容器viewgroup中,remove 是把子view树从fragment的容器viewgroup中移出,replace 是先把之前的fragment的view树从容器viewgroup中移出,再把新的 fragment 的view树添加到fragment的容器viewgroup中。
fragment 的使用步骤
- 创建 Fragment 子类继承 Fragment 类,重写 onCreateView 方法,返回 Fragment 关联的 view子树
- 在 Activity 中使用 getFagmentManager 获取到 FragmentManager 对象
- 使用 FragmentManager 对象开启 fragment 操作事务
- 使用 FragmentTransaction 对象进行 fragment 的 add、replace、remove 操作
- (可选)添加事务到后退栈
- 提交事务
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
未完待续。。。