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。