如果你是在Android 3.0 Honeycomb上開發,並且API級別是11或更高版本,就可以使用Fragment API。但是,如果你傾向於在Honeycomb之前的Android版本上開發,而且想要在用戶界面中使用Fragment對象,則可以使用Android Compatibility Package,如第7章所描述的。本章的示例代碼是通過兩種方式提供的:一種是把API級別11作為目標API,另一種可以是API級別4以上的任何級別的API,和Android 1.6對應。你會發現它們的Fragment代碼是完全相同的,唯一區別在於Fragment類的包聲明不一樣,而且它和Fragment生命週期行為完全相同。
這部分代碼和之前的Activity類類似,演示了生命週期調用,可以在程序運行時觀察它們:
package com.oreilly.demo.pa.ch10.finchlifecycle; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class TestFragment extends Fragment { // get a label for our log entries private final String TAG = this.getClass.getSimpleName; public TestFragment { } @Override public void onAttach(Activity activity) { 1 super.onAttach(activity); Log.i(TAG, \"onAttach\"); } @Override public void onCreate(Bundle saved) { 2 super.onCreate(saved); if (null != saved) { // Restore state here } Log.i(TAG, \"onCreate\"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, 3 Bundle saved) { View v = inflater.inflate(R.layout.fragment_content, container, false); Log.i(TAG, \"onCreateView\"); return v; } @Override public void onActivityCreated(Bundle saved) { 4 super.onActivityCreated(saved); Log.i(TAG, \"onActivityCreated\"); } @Override public void onStart { 5 super.onStart; Log.i(TAG, \"onStart\"); } @Override public void onResume { 6 super.onResume; Log.i(TAG, \"onResume\"); } @Override public void onPause { 7 super.onPause; Log.i(TAG, \"onPause\"); } @Override public void onStop { 8 super.onStop; Log.i(TAG, \"onStop\"); } // //////////////////////////////////////////////////////////////////////////// // Called during the life cycle, when instance state should be saved/restored // //////////////////////////////////////////////////////////////////////////// @Override public void onSaveInstanceState(Bundle toSave) { 9 super.onSaveInstanceState(toSave); Log.i(TAG, \"onSaveinstanceState\"); } }
正如在LogCat過濾器中要顯示Activity組件回調的日誌項時,可以為Fragment回調定制過濾器一樣。
如果重複這些步驟,即啟動其他的應用,直到在LogCat窗口中看到調用了Fragment生命週期方法,你會發現從其包含的View來看,Activity實例中的每個Fragment實例行為都和封閉的Activity行為類似。調用類似的生命週期過渡和狀態。
瞭解了每個方法什麼時候調用,我們先一起來看一看這些方法:
1 當Fragment實例和Activity實例關聯時,會調用onAttach方法。這並不是說Activity類是完全初始化的。
2 當創建或重新創建Fragment實例時,會調用onCreate方法。如果其是在Fragment或其包含的Activity組件被刪除後重新創建的,如果保存了某些狀態,那麼bundle參數會是非空的。
3 當Fragment實例創建包含View的對象層次結構時,會調用onCreateView方法。Fragment在Activity中是很特殊的:它的行為類似ViewGroup,但是它不屬於View類結構。可以把Fragment想成一個支持很多Activity並包含了多個View實例的集合。在這個例子中,我們加載了一個包含TextView的非常簡單的佈局。
4 當創建完包含Fragment實例的Activity及包含Fragment的View對像時,會調用onActivityCreated方法。這時通過ID查找View對象是安全的。
5 當Fragment變得可見時,可以調用onStart方法,該方法和Activity的onStart方法非常相似。
6 當Fragment變得可見並且在運行時,會調用onResume方法。
7 當Fragment要離開前端界面時,會調用onPause方法,它和Activity實例的onPause方法類似。
8 當Fragment要停止運行時,會調用onStop方法。
9 當需要保存實例狀態時,會調用onSaveInstanceState方法,這樣當銷毀該實例時(實際上是刪除引用),需要保存的任何特定的狀態都可以保存在該調用所傳遞的Bundle對像中。
Fragment對像不是組件。可以把Fragment對像看作是一個把Activity對像分解成在Activity中包含的多個對象的一種方式,每個對象包含自己的View結構,它的行為和Activity的View結構的行為類似。