讀古今文學網 > Android程序設計:第2版 > Fragment生命週期可視化 >

Fragment生命週期可視化

如果你是在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結構的行為類似。