天天看點

fragment和fragmentactivity解析

一、為什麼要使用Fragment 

1、當我們須要動态的多界面切換的時候,就須要将UI元素和Activity融合成一個子產品。在2.3中我們一般通過各種Activity中進行跳轉來實作多界面的跳轉和單個界面動态改變。在4.0或以上系統中就能夠使用新的特性來友善的達到這個效果--Fragment類。Fragment類似一個嵌套Activity,能夠定義自己的layout和自己的生命周期。

2、 多個Fragment能夠放在一個Activity中(是以上面講到類似一個嵌套Activity)。而這個類能夠對這些Fragment進行配置以适應不同的螢幕尺寸(比方平闆和手機)。

二、使用Fragment 

1、Fragment 是 activity 的界面中的一部分或一種行為。

能夠把多個 Fragment 組合到一個 activity 中來建立一 個多面界面而且能夠在多個 activity 中重用一個 Fragment。

能夠把 Fragment 覺得子產品化的一段 activity,它具 有自己的生命周期,接收它自己的事件,并能夠在 activity 執行時被加入或删除。

2、Fragment 不能獨立存在,它必須嵌入到 activity 中,并且 Fragment 的生命周期直接受所在的 activity 的影 響。

3、當向 activity 中加入一個 Fragment 時,它須置于 ViewGroup 控件中,而且需定義 Fragment 自己的界面。

可 以在 layoutxml 檔案裡聲明 Fragment,元素為:<fragment>;也能夠在代碼中建立 Fragment,然後把它加入到 ViewGroup 控件中。

然而,Fragment 不一定非要放在 activity 的界面中,它能夠隐藏在背景為 actvitiy 工作。

三、 生命周期

通常, 應當至少實作例如以下的生命周期方法:

onCreate()

當建立fragment時, 系統調用該方法. 

在實作代碼中,應當初始化想要在fragment中保持的必要元件, 當fragment被暫停或者停止後能夠恢複.

onCreateView()

fragment第一次繪制它的使用者界面的時候, 系統會調用此方法. 為了繪制fragment的UI,此方法必須傳回一個View, 這個view是你的fragment布局的根view. 假設fragment不提供UI, 能夠傳回null.

onPause()

使用者将要離開fragment時,系統調用這種方法作為第一個訓示(然而它不總是意味着fragment将被銷毀.) 在目前使用者會話結束之前,通常應當在這裡送出不論什麼應該持久化的變化(由于使用者有可能不會傳回).

大多數程式應最少對 fragment 實作這三個方法。

當然還有其他幾個回調方法可應該按情況實作之。

下圖為 fragment 的生命周期(它所在的 activity 處于執行狀态)。

fragment和fragmentactivity解析

四、怎樣使用Fragment 

1、加入一個使用者界面   

         fragment通經常使用來作為一個activity的使用者界面的一部分,并将它的layout提供給activity.為了給一個fragment提供一 個layout,你必須實作 onCreateView()回調方法, 當到了fragment繪制它自己的layout的時候,Android系統調用它.你的此方法的實作代碼必須傳回一個你的fragment的 layout的根view. 

       從onCreateView()傳回的View, 也能夠從一個layout的xml資源檔案裡讀取并生成. 為了幫助你這麼做, onCreateView() 提供了一個LayoutInflater 對象.

      舉個樣例, 這裡有一個Fragment的子類, 從檔案 frament_main.xml 載入了一個layout:

PS

傳入onCreateView()的container參數是你的fragmentlayout将被插入的父ViewGroup(來自activity的layout)  savedInstanceState 參數是一個Bundle, 假設fragment是被恢複的,它提供關于fragment的之前的執行個體的資料,

inflate() 方法有3個參數:

a、想要載入的layout的resource ID.

b、載入的layout的父ViewGroup.傳入container是非常重要的, 目的是為了讓系統接受所要載入的layout的根view的layout參數,由它将挂靠的父view指定.

c、布爾值訓示在載入期間, 展開的layout是否應當附着到ViewGroup (第二個參數).

2、将fragment加入到activity

        通常地, fragment為宿主activity提供UI的一部分, 被作為activity的整個viewhierarchy的一部分被嵌入. 有2種方法你能夠加入一個fragment到activity layout:

2.1、使用XML将Fragment加入到一個Activity中

       在這樣的情況下。你能夠像為View一樣, 為fragment指定layout屬性。

   1、<fragment> 中的 android:name屬性指定了在layout中執行個體化的Fragment類.

     當系統建立這個activity layout時,它執行個體化每個在layout中指定的fragment,并調用每個上的onCreateView()方法,來擷取每個 fragment的layout.系統将從fragment傳回的 View直接插入到<fragment>元素所在的地方. 

   2、通過在xml中定義fragment的方式。我們不能在執行時移除fragment。假設我們想要通過切換fragments來跟使用者有更好的互動。那麼就須要在activity啟動的時候定義fragment了。

2.2、在執行時加入一個Fragment到Activity

上面一節的在activity的布局檔案(layout xml)中加入Fragment的方法我們已經知道了。

如今我們将學習第二種方式。這樣的方式同意我們在執行時動态的顯示和隐藏fragment。為了達到在activity中動态管理Fragment,我們須要用到FragmentManager,而且通過它建立FragmentTransaction。

activity同意移除或者替換fragment須要有例如以下條件:

  1、activity的onCreate()方法中加入初始化的fragment

  2、fragment放置位置的布局中必須有一個視圖容器

比方:res/layout/news_articles.xml檔案提供了視圖容器。

Activity中使用getSupportFragmentManager()擷取FragmentManager,之後調用beginTransaction去建立一個FragmentTransaction對象, 再調用add()方法就可以加入一個fragment。 在activity中能夠使用同一個FragmentTransaction對象去運作多個fragment事務,當做這樣操作時。必須調用commint()方法。 以下的代碼示範如何加入一個fragment到res/layout/news_articles.xml的layout:

add()的第一個參數是fragment要放入的ViewGroup, 由resource ID指定,第二個參數是須要加入的fragment.一旦用FragmentTransaction做了改變,為了使改變生效,必須調用commit().

如今再來說明另外一個執行個體,執行個體圖例如以下。我要在四個标簽頁面切換(首頁。手機,配件,購物車)

fragment和fragmentactivity解析

代碼例如以下,詳細就是通過影藏和顯示fragment來實作切換

3、Frament 管理

要管理 fragment,需使用 FragmentManager,要擷取它,需在 activity 中調用方法 getFragmentManager()。

能夠用 FragmentManager 來做以上事情:

用法 findFragmentById()或 findFragmentByTag(),擷取 activity 中已存在的 fragment

用法 popBackStack()從 activity 的後退棧中彈出 fragment(這能夠模拟後退鍵引發的動作)

用方法 addOnBackStackChangedListerner()注冊一個偵聽器以監視後退棧的變化

還能夠使用 FragmentManager 打開一個 FragmentTransaction 來運作 fragment 的事務,比方加入或删除 fragment。

在 activity 中使用 fragment 的一個偉大的優點是能跟據使用者的輸入對 fragment 進行加入、删除、替換以及運作 其他動作的能力。

送出的一組 fragment 的變化叫做一個事務。

事務通過 FragmentTransaction 來運作。還能夠把每一個 事務儲存在 activity 的後退棧中,這樣就能夠讓使用者在 fragment 變化之間導航(跟在 activity 之間導航一樣)。

能夠通過 FragmentManager 來取得 FragmentTransaction 的執行個體,例如以下:

一個事務是在同一時刻運作的一組動作(非常像資料庫中的事務)。

能夠用 add(),remove(),replace()等方法構成事務,最後使用 commit()方法送出事務。在調用 commint()之前,能夠用addToBackStack()把事務加入到一個後退棧中, 這個後退棧屬于所在的 activity。有了它,就能夠在使用者按下傳回鍵時,傳回到 fragment 運作事務之前的狀态。如 下例:示範了怎樣用一個 fragment 取代還有一個 fragment,同一時候在後退棧中儲存被取代的 fragment 的狀态。

4、為Activity建立事件回調方法

在一些情況下, 你可能須要一個fragment與activity分享事件. 一個好的方法是在fragment中定義一個回調的interface, 并要求宿主activity實作它.當activity通過interface接收到一個回調, 必要時它能夠和在layout中的其它fragment分享資訊.

    比如, 假設一個新的應用在activity中有2個fragment – 一個用來顯示文章清單(framgent A), 還有一個顯示文章内容(fragment B) – 然後 framgent A必須告訴activity何時一個list item被選中,然後它能夠告訴fragmentB去顯示文章.

最後在簡單說說一個項目的大緻實作,比方在手機上面實作了一個FragmentActivity + 多個fragment(登入。菜單,具體,賬戶等頁面)。

1、每個項目包含非常多活動,每個活動(FragmentActivity)互相不影響,每個活動(FragmentActivity)包含非常多子活動(fragment,一個頁面),每個子活動也互相不影響.

2、每個活動(FragmentActivity)用FrameLayout來顯示子活動,而且對活動進行堆棧管理,實作資料不用反複拉取。就跟搜狐新聞一樣的效果.

3、登入(FragmentActivity):logo頁面,登入頁面

4、菜單(FragmentActivity):菜單選擇頁面(側邊欄,滑動),子菜單功能(每個新聞頁面)

5、其它(FragmentActivity):上傳頁面,下載下傳頁面等

每個活動(FragmentActivity)實作了互相不影響。

本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5393911.html,如需轉載請自行聯系原作者