天天看點

Android系列之Fragment(一)----Fragment加載到Activity當中

【正文】

android上的界面展示都是通過activity實作的,activity實在是太常用了。但是activity也有它的局限性,同樣的界面在手機上顯示可能很好看,在平闆上就未必了,因為平闆的螢幕非常大,手機的界面放在平闆上可能會有過分被拉長、控件間距過大等情況。這個時候更好的體驗效果是在activity中嵌入"小activity",然後每個"小activity"又可以擁有自己的布局。是以,我們今天的主角fragment登場了。

一、fragment初探:

fragment是activity的界面中的一部分或一種行為。你可以把多個fragment們組合到一個activity中來建立一個多面界面,并且你可以在多個activity中重用一個fragment。你可以把fragment認為子產品化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity運作時被添加或删除。

fragment不能獨立存在,它必須嵌入到activity中,而且fragment的生命周期直接受所在的activity的影響。例如:當activity暫停時,它擁有的所有的fragment們都暫停了,當activity銷毀時,它擁有的所有fragment們都被銷毀。然而,當activity運作時(在onresume()之後,onpause()之前),你可以單獨地操作每個fragment,比如添加或删除它們。當你在執行上述針對fragment的事務時,你可以将事務添加到一個棧中,這個棧被activity管理,棧中的每一條都是一個fragment的一次事務。有了這個棧,就可以反向執行fragment的事務,這樣就可以在fragment級支援“傳回”鍵(向後導航)。

當向activity中添加一個fragment時,它須置于viewgroup控件中,并且需定義fragment自己的界面。你可以在layoutxml檔案中聲明fragment,元素為:<fragment>;也可以在代碼中建立fragment,然後把它加入到viewgroup控件中。然而,fragment不一定非要放在activity的界面中,它可以隐藏在背景為actvitiy工作。

設計的哲學:

為了讓界面可以在平闆上更好地展示,android在3.0版本引入了fragment(碎片)功能,通過官方文檔中的這張圖檔可以很明顯地看到fragment的好處:

Android系列之Fragment(一)----Fragment加載到Activity當中

注:左邊為平闆,右邊為手持裝置。

二、fragment的生命周期:

因為fragment必須嵌入在acitivity中使用,是以fragment的生命周期和它所在的activity是密切相關的。

如果activity是暫停狀态,其中所有的fragment都是暫停狀态;如果activity是stopped狀态,這個activity中所有的fragment都不能被啟動;如果activity被銷毀,那麼它其中的所有fragment都會被銷毀。

但是,當activity在活動狀态,可以獨立控制fragment的狀态,比如加上或者移除fragment。

當這樣進行fragment transaction(轉換)的時候,可以把fragment放入activity的back stack中,這樣使用者就可以進行傳回操作。

使用fragment時,需要繼承fragment或者fragment的子類(dialogfragment, listfragment, preferencefragment, webviewfragment),是以fragment的代碼看起來和activity的類似。

每當建立一個fragment時,首先添加以下三個回調方法:

oncreate():系統在建立fragment的時候調用這個方法,這裡應該初始化相關的元件,一些即便是被暫停或者被停止時依然需要保留的東西。

oncreateview():當第一次繪制fragment的ui時系統調用這個方法,該方法将傳回一個view,如果fragment不提供ui也可以傳回null。注意,如果繼承自listfragment,oncreateview()預設的實作會傳回一個listview,是以不用自己實作。

onpause():當使用者離開fragment時第一個調用這個方法,需要送出一些變化,因為使用者很可能不再傳回來。

将fragment加載到activity當中有兩種方式:

方式一:添加fragment到activity的布局檔案當中

方式二:在activity的代碼中動态添加fragment

第一種方式雖然簡單但靈活性不夠。添加fragment到activity的布局檔案當中,就等同于将fragment及其視圖與activity的視圖綁定在一起,且在activity的生命周期過程中,無法切換fragment視圖。

第二種方式比較複雜,但也是唯一一種可以在運作時控制fragment的方式(加載、移除、替換)。

下面将分别介紹一下。

  

三、在activity的布局檔案中添加fragment:(不推薦)

平闆的模拟器參數如下:

Android系列之Fragment(一)----Fragment加載到Activity當中

然後建立一個工程檔案。然後繼續如下步驟:

(1)建立檔案fragment_hello.xml和hellofragment.java:

fragment_hello.xml代碼如下:(即fragment的布局檔案)

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

hellofragment.java代碼如下:

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

重點在于第19和20行,通過inflate()方法将自定義的fragment的布局加載進來。

19行代碼中,第二個參數中,如果布局沒有根,那就用null。

注:上方代碼中,因為我們的程式是面對android 4.0以上版本的,是以導入fragment的包時,選擇第一個:android.app.fragment

Android系列之Fragment(一)----Fragment加載到Activity當中

(2)将fragment添加到activity的布局中:

修改activity_main.xml的代碼如下:

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

08行和09行是關鍵。其中android:name屬性填上你自己建立的fragment的完整類名。如下圖:

Android系列之Fragment(一)----Fragment加載到Activity當中

當系統建立這個activity的布局檔案時,系統會執行個體化每一個fragment,并且調用它們的oncreateview()方法,來獲得相應fragment的布局,并将傳回值插入fragment标簽所在的地方。

運作之後,效果如下:

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

實際上,這種方式在開發中并不推薦,我們來介紹另外一種方法。

四、在activity代碼中添加fragment:

【執行個體】點選左側fragment中的按鈕,彈出右側的fragment。建立一個工程檔案,然後步驟如下:

(1)将activity_main的布局分為兩部分:左邊占1/4,右邊占3/4。修改activity_main.xml的代碼如下:

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

上方代碼中,一個linearlayout代表一個fragment的容器,記得要給每個fragment加一個容器的id。上方代碼的布局效果如下:

Android系列之Fragment(一)----Fragment加載到Activity當中

既然兩個fragment的空間都配置設定好了,接下來右邊的fragment寫出來。

(2)建立檔案fragment_right.xml和rightfragment.java:

fragment_right.xml代碼如下:(添加一個文本和按鈕)

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

rightfragment.java代碼如下:

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

緊接着,我們修改上方oncreateview()方法中的代碼,實作點選按鈕,能夠彈出吐司:

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

第04行代碼:有一個單詞view不要忘了。

第08行代碼:第一個參數一定是getactivity,以此來獲得父類的activity

(3)在activity代碼中添加fragment:

點選mainactivity中左側的按鈕,彈出右側的fragment,

mainactivity.java的監聽器部分的代碼如下:

Android系列之Fragment(一)----Fragment加載到Activity當中
Android系列之Fragment(一)----Fragment加載到Activity當中

記住上面的三個步驟。

第12行代碼是整個程式的核心。add()方法裡的第一個參數是容器視圖資源id,而不是layout。容器視圖資源id有兩個作用:

告知fragmentmanager,fragment視圖應該出現在activity視圖的什麼地方

是fragmentmanager隊列中fragment的唯一辨別符

運作後,效果如下:

Android系列之Fragment(一)----Fragment加載到Activity當中

點選左側的按鈕後,出現右側的界面。點選右側的按鈕,彈出吐司。效果如下:

Android系列之Fragment(一)----Fragment加載到Activity當中

當然,這個代碼還不夠成熟,因為還涉及到了生命周期沒有處理。我們将在下一章節中進行講解。

繼續閱讀