標籤:
郭孝星
微博:郭孝星的新浪微博
郵箱:[email protected]
部落格:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells
如果我們的App設計成要支援範圍廣泛的螢幕尺寸時,在可利用的螢幕空間內,我們可以通過在不同的布局配置中重用你的Fragment來最佳化我們的使用者體驗。一個手機裝置可能適合一次只有一個Fragment的單面板使用者互動。相反,在更大螢幕尺寸的平板電腦上,我們可能更想要兩個Fragment並排在一起,用來向使用者展示更多資訊。
如所示:
Fragment是Activity模組化的一部分,它擁有自己的生命週期,接收自己的輸入事件,可以在Activity運行中被添加和移除,也可以被多個Activity所複用。
一 Fragment的特性
總的說來,Fragment具備以下特性:
- Fragment總是作為Activity介面的組成部分,Fragment可調用getActivity()方法擷取它所在的Activity;Activity可以通過FragmentManager的findFragmentById()方法或者findFragmentByTag()方法來擷取相應的Fragment。
- 在Activity運行過程中,可以通過FragmentManager的add()、remove()和replace()方法來添加、刪除或替換Fragment。
- 一個Activity可以同時使用多個Framework,同一個Fragment也可以被多個Activity所複用。
- Fragment可以響應自己的輸入事件,並有自己的生命週期,但是Fragment的生命週期直接被它所屬的Activity所控制。
二 Fragment的生命週期和回調方法Fragment的生命週期
Fragment的生命週期如所示:
- 活動狀態:當前Fragment位於前台,使用者可見,可以獲得焦點。
- 暫停狀態:其他Activity位於前台,Fragment依然可見,只是不能獲得焦點。
- 停止狀態:Fragment不可見,失去焦點。
- 銷毀狀態:Fragment被完全刪除,或者該Fragment所在的Activity被結束。
Fragment的回調方法
Fragment的回調方法如所示:
- onAttach():當Fragment被添加到Activity時被回調,該方法只會被調用一次。
- onCreate():系統建立Fragment對象後回調該方法,實現代碼中只初始化需要在Fragment中保持的必要組件,當Fragment被暫停或者停止後可以恢複。該方法只會被調用一次。
- onCreateView():當Fragment繪製介面組件時會回調該方法,該方法返回一個View,這個View就是Fragment所顯示的View。
- onActivityCreated():當Fragment所在的Activity啟動完成後回調該方法。
- onResume():恢複Fragment時被回調,onStart()調用之後一定會調用onResume()方法。
- onPause():當使用者離開該Fragment時會回調該方法。
- onDestory():銷毀Fragment時被回調,該方法只會被調用一次。
- onDetach():將該Fragment從Activity中刪除,被替換完成時會回調該方法,onDestory()方法調用後一定會回調onDetach()方法,該方法只會被調用一次。
下面我們通過一個例子來示範Fragment的生命週期和回調方法的調用過程。
主程式介面如下所示:
自訂的Fragment的各個回調方法都加入了列印來觀察回調方法的變化情況,源碼如下所示:
Fragment生命週期與回調方法示範用例下載
LifecycleFragment源碼
package org.crazyit.app;import android.app.Activity;import android.app.Fragment;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class LifecycleFragment extends Fragment{ final String TAG = "LifecycleFragment"; @Override public void onAttach(Activity activity) { super.onAttach(activity); // 輸出日誌 Log.d(TAG, "-------onAttach------"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 輸出日誌 Log.d(TAG, "-------onCreate------"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle data) { // 輸出日誌 Log.d(TAG, "-------onCreateView------"); TextView tv = new TextView(getActivity()); tv.setGravity(Gravity.CENTER_HORIZONTAL); tv.setText("測試Fragment"); tv.setTextSize(40); return tv; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // 輸出日誌 Log.d(TAG, "-------onActivityCreated------"); } @Override public void onStart() { super.onStart(); // 輸出日誌 Log.d(TAG, "-------onStart------"); } @Override public void onResume() { super.onResume(); // 輸出日誌 Log.d(TAG, "-------onResume------"); } @Override public void onPause() { super.onPause(); // 輸出日誌 Log.d(TAG, "-------onPause------"); } @Override public void onStop() { super.onStop(); // 輸出日誌 Log.d(TAG, "-------onStop------"); } @Override public void onDestroyView() { super.onDestroyView(); // 輸出日誌 Log.d(TAG, "-------onDestroyView------"); } @Override public void onDestroy() { super.onDestroy(); // 輸出日誌 Log.d(TAG, "-------onDestroy------"); } @Override public void onDetach() { super.onDetach(); // 輸出日誌 Log.d(TAG, "-------onDetach------"); }}
第一次點擊載入目標Fragment
進入應用後,我們首先點擊載入目標Fragment,我們會發現Fragment會先onAttach()添加到當前Activity,建立完成後調用onResume(),函數調用鏈如所示:
第二次點擊載入目標Fragment
當我們再次點擊載入Fragment時,原來的Fragment會被銷毀,新的Fragment會被建立,函數調用鏈如下所示:
點擊啟動對話方塊風格的Activity
當Fragment已經建立,我們再去點擊啟動對話方塊風格的Activity,對話方塊啟動後,Activity處於Pause狀態,那麼從屬於它的Fragment自然也會處於Pause狀態,如所示:
當對話方塊退出後,Activity恢複,Fragment也隨之恢複,如所示:
點擊替換目標Fragment並加入Back棧
當我們點擊替換目標Fragment並加入Back棧,此時Fragment雖然不可見,但是沒有被銷毀,它只是被添加到背景Back棧,如所示:
當使用者按下back鍵時,加入到Back棧的Fragment會再次顯示出來,如所示:
點擊退出
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【Android應用開發技術:應用組件】Fragment基本原理