Android 學習系列 - Fragment

Android Fragment

關於

Fragment表明了 Activity的子模塊,所以能夠把Fragment理解成Activity片斷。Fragment用於本身的生命週期,也能夠接受它本身的輸入事件。java

Fragment必須被「嵌入」 Activity中使用,所以雖然Fragment也擁有本身的生命週期,但Fragment的生命週期會受它所在的Activity的生命週期的控制。例如,當Activity暫停時,該Activity內的全部Fragment都會暫停;當Activity被銷燬時,該Activity內的全部Fragment 都會被銷燬,只有當該Activity處於活動狀態時,程序員可經過方法獨立地操做Fragment。android

fragment引入的緣由是爲了響應式適配:程序員

例子: tablet , phone數據庫

tablet-main-activity{
    navFragment + contentFragment
}

phone-main-activity {
    navFragment
}

phone-content-activity{
    contentFragment
}

與Activity相似的是,Fragment也存在以下狀態。數組

  1. 活動狀態:當前Fragment位於前臺,用戶可見,能夠得到焦點。app

  2. 暫停狀態:其餘Activity位於前臺,該Fragment依然可見,只是不能得到焦點。ide

  3. 中止狀態:該Fragment不可見,失去焦點。佈局

  4. 銷燬狀態:該Fragment被徹底刪除,或該Fragment所在的Activity被結束。翻譯

Fragment 特徵

  1. Fragment老是做爲Activity界面的組成部分,Fragment可調用getActivity()方法獲取它所在的 Activity, Activity調用FragmentManager 的findFragmentByld()或findFragmentByTag()方法來獲取Fragment。code

  2. 在Activity 運行過程當中,可調用 FragmentManager 的add()、remove()、replace()方法動態地添加、刪除或替換Fragment。

  3. —個Activity能夠同時組合多個Fragment;反過來,一個Fragment也可被多 Activity 複用。

  4. Fragment能夠響應本身的輸入事件,並擁有本身的生命週期,但它們的生命週期直接被其所屬的Activity的生命週期控制。

建立fragment

fragment類關係

android.app.Fragment
 extends Object
 implements ComponentCallbacks2 View.OnCreateMenuListener

 subclass
 DialogFragment, ListFragment, PreferenceFragment, WebViewFragment

生命週期回調方法

// 當該Fragment被添加到Activity時被回調。該方法只會被調用一次
 onAttatch() 

 // 系統建立Fragment對象後回調該方法,實現代碼中只初始化想要在 
 // Fragment中保持的必要組件,當fragment被暫停或者中止後能夠恢復。
 onCreate() ->

 // 當Fragment繪製界面組件時會回調該方法。該方法必須返回一個View,
 // 該View也就是該Fragment所顯示的View。
 onCreateView() ->

 // 當 Fragment 所在的 Activity 被啓動完成後回調該方法
 onActivityCreated()

 // 啓動 Fragment 時被回調
 onStart ->

 // 恢復 Fragment 時被回調,onStart()方法後必定會回調()onResume()方法
 onResume ->

 // 當用戶離開該Fragment時將會回調該方法。
 onPause ->
 onStop() ->
 
 // 銷燬該 Fragment 所包含的 View 組件時調用
 onDestroyView() ->

 // 銷燬Fragment時被回調。該方法只會被調用一次。
 onDestroy()  ->

 // 將該 Fragment 從 Activity 中被刪除、被替換完成時回調該方法,onDestroy()
 // 方法後必定會回調onDetach()方法。該方法只會被調用一次。
 onDetach()

開發Fragment與開發Activity很是類似,區別只是開發Activity須要繼承Activity或其子類;但開發Fragment須要繼承Fragment及其子類, 與此同時,只要將原來寫在Activity回調方法的代碼「移到」Fragment的回調方法中便可。

sample

public class BookDetailFragment extends Fragment
{
    public static final String ITEM_ID = "item_id";
    // 保存該Fragment顯示的Book對象
    BookContent.Book book;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // 若是啓動該Fragment時包含了ITEM_ID參數
        if (getArguments().containsKey(ITEM_ID))
        {
            book = BookContent.ITEM_MAP.get(getArguments()
            .getInt(ITEM_ID)); //①
        }
    }
    // 重寫該方法,該方法返回的View將做爲Fragment顯示的組件
    @Override
    public View onCreateView(LayoutInflater inflater
    , ViewGroup container, Bundle savedInstanceState)
    {
    // 加載/res/layout/目錄下的fragment_book_detail.xml佈局文件
        View rootView = inflater.inflate(R.layout.fragment_book_detail,
        container, false);
        if (book != null)
        {
        // 讓book_title文本框顯示book對象的title屬性
        ((TextView) rootView.findViewById(R.id.book_title))
        .setText(book.title);
        // 讓book_desc文本框顯示book對象的desc屬性
        ((TextView) rootView.findViewById(R.id.book_desc))
        .setText(book.desc);
        }
        return rootView;
    }
}

Fragment 與activity的交互

如何應用fragment 到 activity 中

  1. 在佈局文件中添加:在佈局文件中使用元素添加Fragment,其中的android:name屬性必須指定Fragment的實現類。

  2. 在Java代碼中經過FragmentTransaction對象的relpace()或add()方法來替換或添加Fragment。Activity的getFragmentManager()方法返回FragmentManager,經過調用FragmentManager的beginTransaction()方法獲取FragmentTransaction對象。

在activity中獲取Fragement,在Fragment中獲取activity的方法:

  1. Fragment獲取它所在的Activity:調用Fragment的getActivity()方法便可返回它所在的Activity。

  2. Activity 獲取它包含的Fragment:調用 Activity 關聯的 FragmentManager 的 findFragmentByld(int id)或findFragmentByTag(String tag)方法便可獲取指定的 Fragment。

  3. 在界面佈局文件中使用元素添加Fragment時,能夠爲元素指定android:id或android:tag屬性,這兩個屬性均可用於標識該 Fragment,接下來 Activity 將可經過 findFragmentByld(int id)或 findFragmentByTag(String tag)來獲取該 Fragment。

Fragment與Activity可能還須要相互傳遞數據的方式

Activity向Fragment傳遞數據: 在Activity中建立Bundle數據包, 並調用Fragment 的setArguments(Bundle bundle)方法便可將 Bundle 數據包傳給 Fragment。

Fragment向Activity傳遞數據或Activity須要在Fragment運行中進行實時通訊: 在Fragment中定義一個內部回調接口,再讓包含該Fragment的Activity實現該回調接口,這樣Fragment便可調用該回調方法將數據傳給Activity。

FragmentMange的功能

  1. 使用 findFragmentByld()或 findFragmentByTag()方法來獲取指定 Fragment。

  2. 調用popBackStack()方法將Fragment從後臺找中彈出(模擬用戶按下BACK按鍵)。

  3. 調用addOnBackStackChangeListener()註冊個監聽器,用於監聽後臺棧的變化。若是須要添加、刪除、替換Fragment,則須要藉助FragmentTransaction對象, FragmentTransaction 表明 Activity 對 Fragment 執行的多個改變。

ragmentTransaction也被翻譯爲Fragment事務。與數據庫事務相似的是,數據庫事務表明了對底層數組的多個更新操做;而Fragment事務則表明了Activity對Fragment執行的多個改變操做。

每一個FragmentTransaction能夠包含多個對Fragment的修改,好比包含調用多個add()、replace()、和remove()操做,最後調用commit()提交事務便可。

在調用commit()以前,開發者也可調用addToBackStack()將事務添加到back棧,該棧由Activity負責管理,這樣容許用戶按BACK按鍵返回到前一個Fragment狀態。

相關文章
相關標籤/搜索