Fragment必须内嵌到activity中,它不能单独使用,并且它的生命周期受到activity生命周期的制约——当activity暂停时,所有的fragment暂停,当activity停止时,所有的fragment停止。只有当activity处于运行态(resumed in lifecycle state)时,才可以单独操作各个fragment,比如添加或删除。在fragment事件中,activity管理着一个fragment返回栈。

在activity的layout中,fragment存在于activity的一个ViewGroup内。并且fragment定义了自己的view布局。有两种方式添加fragment布局——一是在activity layout中使用<fragment>标签。或者在代码中添加到一个ViewGroup中。当然,fragment也可以以没有UI的方式存在。

Creating a Fragment

创建一个Fragment的方法,同创建activity一样,需要创建一个继承自Fragment类或其子类的一个类,并实现onCreate(),onStart()等必要的回调方法。

Fragment生命周期和其对应的生命周期回调方法以及它和activity生命周期的关系图如下:

同activity一样,fragment也有三种存活状态。

Resumed                       fragment在activity运行时处于可见位置

Paused                           另一个activity处于前台获得焦点,但fragment所在的activity仍是可见的,未被完全覆盖。

Stopped                          fragment完全不可见。出现这种情况有两种可能,一是activity处于停止状态,二是fragment从activity中删除掉加入到返回栈中。一个停止态的fragment仍处于激活态(它的所有状态和成员信息由系统保留)。

同activity一样,当activity进程被系统杀死,重新创建fragment后,我们想恢复之前保存的状态,做法是在onSaveInstanceState()中保存相关的数据,而在onCreate(),onCreateView()或者onActivityCreated()中恢复保存的数据。

当activity停止时,它被自动保存在一个由系统管理的返回栈中,用户可以点击返回按钮回到这个activity。然而,fragment被保存在一个由activity管理的返回栈中,当去除fragment时,我们必须显式的调用addToBackStack()才能把它保存在返回栈中。

fragment的生命周期受到activity生命周期的直接影响。比如,当activity接收onPause()时,该activity中的每个fragment都会接收onPause()。需要指出的是fragment中新有的几个回调函数。

onAttach()                         fragment被绑定到activity时调用。

onCreateView()               创建fragment布局视图时调用。

onActivityCreated()         当activity的onCreate()方法返回时调用。

onDestroyView()              fragment视图删除时调用。

onDetach()                        fragment从activity中解除绑定时调用。

Communicating with the Activity

尽管Fragment对象独立于activity对象,它可以被使用于多个activity中,一个给定的fragment实例还是直接被绑定到包含它的activity实例中的。

在fragment中通过getActivity()可以获取activity实例,然后与activity中的成员进行交互操作。

比如:

View listView = getActivity().findViewById(R.id.list);

同样的,activity可以通过FragmentManager获取fragment的引用,例如:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

Creating event callbacks to the activity

在一些实例中,可能需要fragment和activity共享events。一个好的方法是在fragment中定义回调接口,而在activity中实现它。当activity通过接口获得回调时,它就可以与其它fragment在必要的时候共享信息。

例如:一个activity中有两个fragment。一个显示文章列表(fragment A),一个显示具体的文章内容(fragment B)。A必须告知activity用户选取了哪一篇文章,然后B从activity中获知这一信息以显示对应的文章内容。在这一实例中,OnArticleSelectedListener接口在A中声明:

public static class FragmentA extends ListFragment {
...
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(Uri articleUri);
} OnArticleSelectedListener mListener;
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
...
}

在activity中我们需要实现这个OnArticleSelectedListener接口,并复写onArticleSelected()函数通知B响应响应的事件。为了保证activity实现了这一接口,A的onAttach()回调初始化了OnArticleSelectedListener接口把activity传递过来。

Adding items to the Action Bar

通过onCreateOptionsMenu(),fragment可以为activity的Options Menu提供菜单项。为了确保这一方法成功实现回调。必须在onCreate()期间调用setHasOptionsMenu()告知Options Menu fragment要添加菜单项。

通过fragment添加的菜单会添加在已有菜单之后。选中菜单项时,fragment也会接收onOptionsItemSelected()回调。

通过registerForContextMenu()注册,onCreateContextMenu()接收用户打开信息,onContextItemSelected()接收用户点击信息可以实现Context Menu。

用户点击菜单的信息首先传递给activity,如果activity不处理,则传递给fragment。

最新文章

  1. 在rails中 Rendering Partials through Ajax
  2. java的静态代理和动态代理(jdk、cglib)
  3. SQL Server中TEXT类型字段值在数据库中追加字符串方法
  4. miniui datagrid 保存到服务端,使用.NET 自带 JSON 转换时发现日期格式不兼容。
  5. HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
  6. Linq101-Ordering
  7. FAQ:win7和win8 64位注册ocx控件方法
  8. js 系统时间对象
  9. HTML5本地图片裁剪并上传
  10. jieba库分词
  11. Ajax - Apache安装配置
  12. Java和js操作json
  13. WEB网站类型系统中使用的OFFICE控件
  14. json与bson的区别
  15. Zookeeper简介与使用
  16. RNA测序研究现状与发展
  17. EF学习笔记-2 EF之支持复杂类型的实现
  18. Python测试 ——开发工具库
  19. 【AHOI2006】基因匹配
  20. python学习之老男孩python全栈第九期_day021知识点总结——包、异常处理

热门文章

  1. CloudStack 4.2 新功能:集成SNMP进行系统监控(原理篇)
  2. 浅谈Jquery的使用下篇
  3. Eclipse用法和技巧一:还原视图和编辑器
  4. net core VS goang web
  5. Ubuntu下安装Android SDK(图文教程)
  6. HTML语言简单回顾
  7. C++学习之路—引用(一)—基础知识
  8. 爬虫总结_java
  9. 在屏幕上建立ALV
  10. Lucene.Net 2.3.1开发介绍 —— 简介