Android的Fragment

一、Fragment的產生與介紹

Android 運行在各類各樣的設備中,有小屏幕的手機,超大屏的平板甚至電視。針對屏幕尺寸的差距,不少狀況下,都是先針對手機開發一套App,而後拷貝一份,修改布 局以適應平板神馬超級大屏的。難道沒法作到一個App能夠同時適應手機和平板麼,固然了,必須有啊。Fragment的出現就是爲了解決這樣的問題。你能夠把Fragment當成Activity的一個界面的一個組成部分,甚至Activity的界面能夠徹底有不一樣的Fragment組成,更帥氣的是 Fragment擁有本身的生命週期和接收、處理用戶的事件,這樣就沒必要在Activity寫一堆控件的事件處理的代碼了。更爲重要的是,你能夠動態的添 加、替換和移除某個Fragment。android

二、Fragment的生命週期app

Fragment必須是依存與Activity而存在的,所以Activity的生命週期會直接影響到Fragment的生命週期。官網這張圖很好的說明了二者生命週期的關係:ide

onAttach(Activity)
當Fragment與Activity發生關聯時調用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
建立該Fragment的視圖
onActivityCreated(Bundle)
當Activity的onCreate方法返回時調用
onDestoryView()
與onCreateView想對應,當該Fragment的視圖被移除時調用
onDetach()
與onAttach相對應,當Fragment與Activity關聯被取消時調用
注意:除了onCreateView,其餘的全部方法若是你重寫了,必須調用父類對於該方法的實現。佈局

三、靜態的使用Fragmentspa

這是使用Fragment最簡單的一種方式,把Fragment當成普通的控件,直接寫在Activity的佈局文件中。步驟:繼承

一、繼承Fragment,重寫onCreateView綁定Fragemnt的佈局。接口

二、在Activity中聲明此Fragment,就當和普通的View同樣。生命週期

把Fragment當成普通的View同樣聲明在Activity的佈局文件中,而後全部控件的事件處理等代碼都由各自的Fragment去處理,瞬間以爲Activity好乾淨,代碼的可讀性、複用性以及可維護性是否是瞬間提高了。事件

四、動態的使用Fragment,先靜態的實現Fragment,經過事務進行替換或者刪除的增長。事務

五、app包中的Fragment和v4包下的Fragment的區別

一、儘可能不要用app包中的fragment,由於這個是在3.0以後纔有的,支持的版本過高,在低版本中是是用不了的
二、android.support.v4.app.Fragment:能夠兼容到1.6的版本。
三、關於這兩個fragment使用<fragment>標籤的問題
 (1)app.fragment和v4.fragment都是可使用<fragment>標籤的
      只是在在使用的時候若是是app.fragment則沒有什麼特殊的地方繼承Activity便可。
 (2)當v4.fragment使用<fragment>標籤的時候就要特別注意了:
當這個Activity的佈局中有<fragment>標籤的時候,這個Activity必須繼承
FragmentActivity,不然就會報錯.此時若是不繼承FragmentActivity的話 編譯系統會把<fragment>認爲是app包中的Fragment來處理。可是此時咱們導入的是v4包中的Fragment。

(3)app包中關於Fragment的類和方法在V4包中都是有相應的對應的

六、

Fragment家族經常使用的API

Fragment經常使用的三個類:

android.app.Fragment 主要用於定義Fragment

android.app.FragmentManager 主要用於在Activity中操做Fragment

android.app.FragmentTransaction 保證一些列Fragment操做的原子性,熟悉事務這個詞,必定能明白~

a、獲取FragmentManage的方式:

getFragmentManager() // v4中,getSupportFragmentManager

b、主要的操做都是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()

會將view從UI中移除,和remove()不一樣,此時fragment的狀態依然由FragmentManager維護。

attach()

重建view視圖,附加到UI上並顯示。

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

7.管理Fragment回退棧

相似與Android系 統爲Activity維護一個任務棧,咱們也能夠經過Activity維護一個回退棧來保存每次Fragment事務發生的變化。若是你將 Fragment任務添加到回退棧,當用戶點擊後退按鈕時,將看到上一次的保存的Fragment。一旦Fragment徹底從後退棧中彈出,用戶再次點 擊後退鍵,則退出當前Activity。用FragmentTransaction.addToBackStack(String),將當前的事務添加到退回棧,replace是remove和add的合體,而且若是不添加事務到回退棧,前一個Fragment實例會被銷燬。

8.Fragment與Activity通訊

由於全部的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()。

9.Fragment與Activity通訊經常使用的通訊方法

在Fragment中定義回調的接口,Activity中實現Fragment的接口實現他的方法。

10.Fragmeny與ActionBar和MenuItem集成

Fragment能夠添加本身的MenuItem到Activity的ActionBar或者可選菜單中。

a、在Fragment的onCreate中調用 setHasOptionsMenu(true);

b、而後在Fragment子類中實現onCreateOptionsMenu

c、若是但願在Fragment中處理MenuItem的點擊,也能夠實現onOptionsItemSelected;固然了Activity也能夠直接處理該MenuItem的點擊事件。

11.沒有佈局的Fragment的做用

沒有佈局文件Fragment其實是爲了保存,當Activity重啓時,保存大量數據準備的

相關文章
相關標籤/搜索