Fragment必须内嵌到activity中,它不能单独使用,而且它的生命周期受到activity生命周期的制约——当activity暂停时,全部的fragment暂停,当activity中止时,全部的fragment中止。只有当activity处于运行态(resumed in lifecycle state)时,才能够单独操做各个fragment,好比添加或删除。在fragment事件中,activity管理着一个fragment返回栈。html
在activity的layout中,fragment存在于activity的一个ViewGroup内。而且fragment定义了本身的view布局。有两种方式添加fragment布局——一是在activity layout中使用<fragment>标签。或者在代码中添加到一个ViewGroup中。固然,fragment也能够以没有UI的方式存在。java
Creating a Fragmentide
建立一个Fragment的方法,同建立activity同样,须要建立一个继承自Fragment类或其子类的一个类,并实现onCreate(),onStart()等必要的回调方法。函数
Fragment生命周期和其对应的生命周期回调方法以及它和activity生命周期的关系图以下:布局
同activity同样,fragment也有三种存活状态。this
Resumed fragment在activity运行时处于可见位置spa
Paused 另外一个activity处于前台得到焦点,但fragment所在的activity还是可见的,未被彻底覆盖。code
Stopped fragment彻底不可见。出现这种状况有两种可能,一是activity处于中止状态,二是fragment从activity中删除掉加入到返回栈中。一个中止态的fragment仍处于激活态(它的全部状态和成员信息由系统保留)。htm
同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。