管理 Fragment 生命周期和 Activity 生命周期很相似,同时 Activity 的生命周期对 Fragment 的生命周期也有一定的影响,如下图所示
用下图(来源)来表示 Activity 和 Fragment 的生命周期变化的先后过程是: Fragment 生命周期与 Activity 生命周期的一个关键区别就在于,Fragment 的生命周期方法是由托管Activity而不是操作系统调用的。Activity 中生命周期方法都是 protected,而 Fragment 都是 public,也能印证了这一点,因为 Activity 需要调用 Fragment 那些方法并管理它。
加载 Fragment
静态加载
动态加载
静态加载 在 Activity 的布局文件内声明片段 下边代码是含有两个 Fragment 的 Activity 布局
其中 fragment 中的 android:name 属性要指定 fragment 对应的具体包名路径,当系统创建此 Activity 布局时,会实例化在布局中指定的每个 fragment,并为每个 fragment 调用 onCreateView()方法,以检索每个 fragment 的布局。系统会直接插入 fragment 返回的 View 来替代 fragment 元素。
并且在 Activity 活动里可以直接使用 findViewById() 方法获取 fragment 对应布局里的控件。同样在 fragment 里可以直接使用 getActivity()方法获得绑定的主 Activity 实例,并调用 Activity 里的方法或其他 fragment 实例。
在 Activity 中使用 Fragment 可以很方便的进行添加 add、替换 replace、移除 remove 等操作,这样提交给 Activity 的每组更改都可以称为事务。像上边动态添加 fragment 那样,使用 FragmentTransaction 里的 API 就可以执行一项事务。同时也可以将此事务保存到 Activity 管理的返回栈中,从而用户可以回退到 fragment 改变之前的状态(类似于 activity 回退到上一个页面)。
下边的例子演示了如何替换一个 fragment,并把替换之前的状态保存到 Activity 的返回栈中。
1 2 3 4 5 6
Fragment newFragment = new ExampleFragment(); FragmentTransaction mTransaction = getFragmentManager().beginTransaction(); //用新的 fragment 替换原来fragment 所在位置的布局,并且把此事务添加到返回栈中。 mTransaction.replace(R.id.frame_layout,newFragment); mTransaction.addToBackStack(null); mTransaction.commit();
如果在执行移除 fragment 的事务时没有调用 addToBackStack(),则事务提交时该 fragment 会被销毁,用户将无法回退到该 fragment 。 不过,如果在删除 fragment 时调用了 addToBackStack(),则系统会停止该 fragment,并在用户按返回键时将其恢复。
Fragment 与 Activity 通信
上边说过,在 fragment 中可以调用 getActivity() 获取 activity 的实例并调用 activity 里的方法和布局,同样在 activity 里也可以通过 findFragmentById()(对于在 activity 提供 fragment 布局的) 或 findFragmentByTag() (对于在 activity 提供或者不提供 fragment 布局的)方法获取 fragment 的实例,例如在 activity 中从 FragmentManager 获取对 Fragment 的引用来调用 fragment 中的方法:
1
Fragment fragment = getFragmentManager.findFragmentById(R.id.fragment_container);
使用 FragmentManager 还可以执行的操作包括:
通过 findFragmentById 或 findFragmentByTag 获取 activity 中存在的 fragment 的实例