1. 程式人生 > >fragment 用法小結

fragment 用法小結

fragment,是從fragment或它的派生類的子類。fragment生命週期如下:![GitHub set up](/Users/xiaowenli/Desktop/1354170699_6619.png
)

Fragment是activity的介面中的一部分或一種行為,fragment具有自己的生命週期,接受它自己的事件,並可以在activity執行時被新增或者刪除。

Fragment不能獨立存在,它必須嵌入到activity中,而且Fragment的生命週期直接受到所在的activity的影響。例如:當activity暫停時,它擁有的所有Fragment都暫停了,當activity銷燬時,它所擁有的所有Fragment們全被銷燬。當activity執行時,可以單獨的操作每個Fragment(新增或者刪除它們)

  1. 當一個fragment被建立的時候,呼叫的方法:

    onAttach()
    onCreate()
    onCreateView()
    onActivityCreated()

  2. 當這個fragment對使用者可見的時候,呼叫方法:

    onStart()
    onResume()

  3. 當這個fragment進入“後臺模式”的時候,呼叫方法:

    onPause()
    onStop()

  4. 當這個fragment被銷燬了(或者持有它的activity被銷燬了),呼叫方法:

    onPause()
    onStop()
    onDestroyView()
    onDestroy()
    onDetach()

  5. 就像activitie一樣,以下的方法可以使用Bundle物件儲存一個fragment的物件.

    onCreate()
    onCreateView()
    onActivityCreated()

  6. 區別於activity狀態

    onAttached()—— 當fragment被加入到activity時呼叫(在這個方法中可以獲得所在的activity)。
    onCreateView() —— 當activity要得到fragment的layout時,呼叫此方法,fragment在其中建立自己的layout(介面)。
    onActivityCreated()—— 當activity的onCreated()方法返回後呼叫此方法
    onDestroyView() —— 當fragment中的檢視被移除的時候,呼叫這個方法。
    onDetach()

    —— 當fragment和activity分離的時候,呼叫這個方法。

當執行鍼對Fragment的事務時,可以將事務新增到一個棧中,這個棧被activity管理,棧中的每一條都是一個Fragment的一次事務。有了這個棧,就可以反向執行Fragment的事務,這樣就可以在Fragment級支援“返回”鍵(向後導航)。

當向activity中新增一個Fragment時,它須置於ViewGroup控制元件中,並且需定義Fragment自己的介面。你可以在layoutxml檔案中宣告Fragment,元素為:;也可以在程式碼中建立Fragment,然後把它加入到ViewGroup控制元件中。然而,Fragment不一定非要放在activity的介面中,它可以隱藏在後臺為actvitiy工作。

Android從3.0開始引入fragment,主要是為了支援更靈活的介面設計,比如在平板上的應用。Fragment不需應付view樹中複雜的變化。通過把activity的layout分成fragment,你可以在activity執行時改變它的樣子,並且可以在activity的後退棧中儲存這些改變。
Fragment必須被寫成可重用的模組。因為fragment有自己的layout,自己進行事件響應,擁有自己的生命週期和行為,所以可以在多個activity中包含同一個Fragment的不同例項。這對於介面在不同的螢幕尺寸下都能給使用者完美的體驗尤其重要。比如可以在程式運行於大螢幕中時啟動包含很多fragment的activity,而在運行於小螢幕時啟動一個包含少量fragment的activity。( 這段時引用的,暫時還沒有遇到這個問題)

fragment一般作為activity的使用者介面的一部分,把它自己的layout嵌入到activity的layout中。
要為fragment提供layout,必須實現onCreateView()回撥方法,然後在這個方法中返回一個View物件,這個物件是fragment的layout的根。

如果你的fragment是從ListFragment中派生的,就不需要實現onCreateView()方法了,因為預設的實現已經為你返回了ListView控制元件物件。

要從onCreateView()方法中返回layout物件,可以從layoutxml中生成layout物件。為了幫助你這樣做,onCreateView()提供了一個LayoutInflater物件。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.home_fragment, container, false);
    }

onCreateView()引數中的container是存放fragment的layout的ViewGroup物件。savedInstanceState引數是一個Bundle,跟activity的onCreate()中Bundle差不多,用於狀態恢復。

Inflate()方法有三個引數:
1. layout的資源ID。
2. 存放fragment的layout的ViewGroup。
3. 布林型資料表示是否在建立fragment的layout期間,把layout附加到container上(在這個例子中,因為系統已經把layout插入到container中了,所以值為false,如果為true會導至在最終的layout中建立多餘的ViewGroup)。

把Fragment新增到Activity中

在程式碼中新增fragment到一個ViewGroup

我們可以在執行時,把fragment新增到activity的layout中。只需指定一個要包含fragment的ViewGroup。為了完成fragment的事務(比如新增,刪除,替換等),必須使用FragmentTransaction的方法。你可以從activity獲取到FragmentTransaction,如下:

FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

使用add()方法新增一個fragment

*Fragment fragment =new *Fragment();
fragmentTransaction.add(R.id.fragment_container,fragment);
fragmentTransaction.commit();

使用add()加入fragment時將觸發onAttach(),使用attach()不會觸發onAttach(),而使用detach()會將view從viewtree中刪除,和remove()不同,此時fragment的狀態依然保持著,在使用attach()時會再次呼叫onCreateView()來重繪檢視,注意使用detach()後fragment.isAdded()方法將返回false,在使用attach()還原fragment後isAdded()會依然返回false(需要再次確認)
執行detach()和replace()後要還原檢視的話, 可以在相應的fragment中保持相應的view,並在onCreateView()方法中通過view的parent的removeView()方法將view和parent的關聯刪除後返回