Fragment

Fragment用途

      使開發的App可以同時適應不同大小的手機和平板。可以把Fragment當成Activity的一個界面的一個組成部分,甚至Activity的界面可以完全有不同的Fragment組成,更帥氣的是Fragment擁有自己的生命週期和接收、處理用戶的事件,這樣就不必在Activity寫一堆控件的事件處理的代碼了。更爲重要的是,你可以動態的添加、替換和移除某個Fragment。Fragment可以看成是一個容器可以容納其餘組件,並且Fragment自身也是一個組件。

Fragment生命週期

Fragment必須是依存於某個Activity的,因此Activity的生命週期會直接影響到Fragment的生命週期。官網這張圖很好的說明了兩者生命週期的關係:

可以看到Fragment比Activity多了幾個額外的生命週期回調方法:

 onAttach(Activity)
  當Fragment與Activity發生關聯時調用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
  創建該Fragment的視圖
onActivityCreated(Bundle)
  當Activity的onCreate方法返回時調用
onDestoryView()
  與onCreateView想對應,當該Fragment的視圖被移除時調用
onDetach()
  與onAttach相對應,當Fragment與Activity關聯被取消時調用

注意:除了onCreateView,其他的所有方法如果你重寫了,必須調用父類對於該方法的實現。

Fragment使用

 

  靜態的使用Fragment

靜態使用Fragment只需要將Fragment看作是普通的控件,直接寫在Activity的佈局文件中,步驟:

step1:繼承Fragment,重寫onCreateView決定Fragment的佈局

step2:在Activity中聲明此Fragment,跟普通的View一樣

 

 

  動態使用Fragment

動態使用Fragment就是動態的添加,更新,以及刪除Fragment。
Fragment動態使用時,需要用到的三個常見類:
android.app.Fragment:用於定義Fragment
android.app.FragmentManager:主要用於Activity中操作Fragment
android.app.FragmentTransaction:保證一系列Fragment操作的原子性。
主要的操作是FragmentTransaction的方法:
FragmentTransaction transaction = fm.benginTransatcion();//開啓一個事務

transaction.add() //往Activity中添加一個Fragment

transaction.remove() // 從Activity中移除一個Fragment,如果被移除的Fragment沒有添加到回退棧(回退棧後面會詳細說),這個Fragment實例將會被銷燬。

transaction.replace()//使用另一個Fragment替換當前的,實際上就是remove()然後add()的合體~

transaction.hide()// 隱藏當前的Fragment,僅僅是設爲不可見,並不會銷燬

transaction.show()//  顯示之前隱藏的Fragment

detach()//  將此Fragment從Activity中分離,會銷燬其佈局,但不會銷燬該實例

attach()// 將從Activity中分離的Fragment,重新關聯到該Activity,重新創建其視圖層次

transatcion.commit()//提交一個事務

注意:常用Fragment可能會經常遇到這樣Activity狀態不一致:State loss這樣的錯誤。主要是因爲:commit方法一定要在Activity.onSaveInstance()之前調用。

值得注意的是:如果你喜歡使用Fragment,一定要清楚這些方法,哪個會銷燬視圖,哪個會銷燬實例,哪個僅僅只是隱藏,這樣才能更好的使用它們。

a、比如:我在FragmentA中的EditText填了一些數據,當切換到FragmentB時,如果希望會到A還能看到數據,則適合你的就是hide和show;也就是說,希望保留用戶操作的面板,你可以使用hide和show,當然了不要使勁在那new實例,進行下非null判斷。

b、再比如:我不希望保留用戶操作,你可以使用remove(),然後add();或者使用replace()這個和remove,add是相同的效果。

c、remove和detach有一點細微的區別,在不考慮回退棧的情況下,remove會銷燬整個Fragment實例,而detach則只是銷燬其視圖結構,實例並不會被銷燬。那麼二者怎麼取捨使用呢?如果你的當前Activity一直存在,那麼在不希望保留用戶操作的時候,你可以優先使用detach。

Fragment回退棧

        類似與Android系統爲Activity維護一個任務棧,我們也可以通過Activity維護一個回退棧來保存每次Fragment事務發生的變化。如果你將Fragment任務添加到回退棧,當用戶點擊後退按鈕時,將看到上一次的保存的Fragment。一旦Fragment完全從後退棧中彈出,用戶再次點擊後退鍵,則退出當前Activity。添加一個Fragment事務到回退棧:FragmentTransaction.addToBackStack(String)

Fragment與Activity通信

a、如果你Activity中包含自己管理的Fragment的引用,可以通過引用直接訪問所有的Fragment的public方法

b、如果Activity中未保存任何Fragment的引用,那麼沒關係,每個Fragment都有一個唯一的TAG或者ID,可以通過getFragmentManager.findFragmentByTag()或者findFragmentById()獲得任何Fragment實例,然後進行操作。

c、在Fragment中可以通過getActivity得到當前綁定的Activity的實例,然後進行操作。

注:如果在Fragment中需要Context,可以通過調用getActivity(),如果該Context需要在Activity被銷燬後還存在,則使用getActivity().getApplicationContext()。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章