安卓API指南之Fragment回顧
本系列的文章全部為學習摘要,不偏重各種細節展示,更多的是安卓體系重要節點的羅列,並適時加入少量自己的理解分析,以便能快速的回顧安卓體系結構和那些重要的技術點。
片段Fragment必須始終嵌入在 Activity 中,其生命週期直接受宿主 Activity 生命週期的影響。 例如,當 Activity 暫停時,其中的所有片段也會暫停;當 Activity 被銷燬時,所有片段也會被銷燬。 不過,當 Activity 正在執行(處於已恢復生命週期狀態)時,您可以獨立操縱每個片段,如新增或移除它們,即當Acty在onResume時,其內部Fragment並不一定呼叫對應的onResume方法。
應該將每個片段都設計為可重複使用的模組化 Activity 元件。也就是說,由於每個片段都會通過各自的生命週期回撥來定義其自己的佈局和行為,可以將一個片段加入多個 Activity,因此,應該採用可複用式設計,避免直接從某個片段直接操縱另一個片段。
建立片段
- 要想建立片段,您必須建立 Fragment 的子類(或已有其子類)。通常,您至少應實現以下生命週期方法:
-> onCreate()
系統會在建立片段時呼叫此方法。您應該在實現內初始化您想在片段暫停或停止後恢復時保留的必需片段元件。
-> onCreateView()
系統會在片段首次繪製其使用者介面時呼叫此方法。 要想為您的片段繪製 UI,您從此方法中返回的 View 必須是片段佈局的根檢視。如果片段未提供 UI,您可以返回 null。
-> onPause()
系統將此方法作為使用者離開片段的第一個訊號(但並不總是意味著此片段會被銷燬)進行呼叫。
新增使用者介面
實現 onCreateView() 回撥方法,Android 系統會在片段需要繪製其佈局時呼叫該方法。對此方法的實現返回的 View 必須是片段佈局的根檢視。
例如:
public static class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
inflate() 方法帶有三個引數:
-> 您想要擴充套件的佈局的資源 ID;
-> 將作為擴展布局父項的 ViewGroup。傳遞 container 對系統向擴展布局的根檢視(由其所屬的父檢視指定)應用佈局引數具有重要意義;
-> 布林值。值若為 false,則inflate時僅讓xml佈局限定於container的佈局引數;若傳遞 true 值,inflate時會使container.addview(xml佈局),到最終,佈局中建立一個多餘的檢視組。
向 Activity 新增片段
- 佈局檔案內宣告片段
可通過findFragmentById(),找到,佈局程式碼基本同view的一樣,只是宣告的時候使用< fragment >標籤,name使用全限定名稱。
- 在程式碼中宣告
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
- 新增沒有 UI 的片段
使用片段為 Activity 提供後臺行為,而不顯示額外 UI,新增方法–add(Fragment, String) (為片段提供一個唯一的字串“標記”,而不是檢視 ID)不會收到對 onCreateView() 的呼叫。從 Activity 中獲取片段,則需要使用 findFragmentByTag()方法。
與 Activity 通訊
Activity操作fragment,可以通過 findFragmentById() 或 findFragmentByTag()得到fragment的例項,進一步呼叫其方法。
fragment呼叫Activity方法,可以在fragment中定義一個介面,宣告需要呼叫的方法,然後讓Activity實現該方法,然後按如下程式碼:
public static class FragmentA extends ListFragment {
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");
}
}
...
生命週期
如需 Fragment 內的某個 Context 物件,可以呼叫 getActivity()。但要注意,請僅在片段附加到 Activity 時呼叫 getActivity()。如果片段尚未附加,或在其生命週期結束期間分離,則 getActivity() 將返回 null。
作者: 劉鹹尚
不過,片段還有幾個額外的生命週期回撥,用於處理與 Activity 的唯一互動,以執行構建和銷燬片段 UI 等操作。 這些額外的回撥方法是:
onAttach()
在片段已與 Activity 關聯時呼叫(Activity 傳遞到此方法內)。
onCreateView()
呼叫它可建立與片段關聯的檢視層次結構。
onActivityCreated()
在 Activity 的 onCreate() 方法已返回時呼叫。
onDestroyView()
在移除與片段關聯的檢視層次結構時呼叫。
onDetach()
在取消片段與 Activity 的關聯時呼叫。
其它的用個圖最具代表