天天看點

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

以下内容為原創,轉載請注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

如新浪微網誌下面的标簽切換功能,我以前也寫過一篇博文(http://www.cnblogs.com/tiantianbyconan/archive/2012/02/24/2366237.html),可以實作,用的是tabhost。但是android發展比較迅速,tabhost這玩意現在已經被棄用了,雖說用現在也能用,但是被棄用的東西還是少用為妙。

官方有個fragmenttabhost這麼一個替代品,于是試了一下,發現每次切換tab,都會調用oncreateview()方法,控件被重新加載,也就是說你從tab1切換到别的tab後,再切換回來,tab1的狀态并沒有儲存,重新加載了控件。

搞了半天,暫時沒有好的解決辦法(有朋友知道解決辦法的話,希望聯系我,賜教下哈)

于是,怒了,自己實作一個吧- -

先來看看整個demo的結構:

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

tabafm到tabefm都是fragment,并且每個fragment對應一個布局檔案。

tabafm.java:

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

如上述代碼所示,tabafm是一個fragment,對應的布局檔案是tab_a.xml,并實作了他的所有的生命周期回調函數并列印,便于調試

tab_a.xml布局中有個edittext

其他的fragment大同小異,這裡就不貼出代碼了

現在來看mainactivity:

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

mainactivity上述代碼所示

mainactivity是包含fragment的activity(也就是這裡的5個fragment)

他繼承了fragmentactivity(因為我這裡用的是android-support-v4.jar)

用一個list<fragment>去維護5個fragment,也就是5個tab

main布局中有一個id為tab_content的framelayout,用來存放要顯示的fragment。底部有一個radiogroup,用于tab的切換,如下:

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

現在回到mainactivity中,下面這個fragmenttabadapter類是關鍵,是我自己編寫的用于綁定和處理fragments和radiogroup之間的邏輯關系

現在看下fragmenttabadapter:

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

這裡解決fragment切換重新加載布局的辦法,用的是把幾個fragment全部add,然後根據要顯示的哪個fragment設定show或者hide

效果輸出:

10-10 11:55:41.168: info/system.out(18368): aaaaaaaaaa____onattach      // 第一次進入,顯示taba

10-10 11:55:41.168: info/system.out(18368): aaaaaaaaaa____oncreate

10-10 11:55:41.168: info/system.out(18368): aaaaaaaaaa____oncreateview

10-10 11:55:41.175: info/system.out(18368): aaaaaaaaaa____onactivitycreated

10-10 11:55:41.179: info/system.out(18368): aaaaaaaaaa____onstart

10-10 11:55:41.179: info/system.out(18368): aaaaaaaaaa____onresume

10-10 11:55:44.980: info/system.out(18368): aaaaaaaaaa____onpause      // 從taba切換到tabb(taba調用onpause)

10-10 11:55:44.980: info/system.out(18368): extra---- 1 checked!!!

10-10 11:55:44.996: info/system.out(18368): bbbbbbbbbbb____onattach

10-10 11:55:44.996: info/system.out(18368): bbbbbbbbbbb____oncreate

10-10 11:55:44.996: info/system.out(18368): bbbbbbbbbbb____oncreateview

10-10 11:55:45.004: info/system.out(18368): bbbbbbbbbbb____onactivitycreated

10-10 11:55:45.004: info/system.out(18368): bbbbbbbbbbb____onstart

10-10 11:55:45.004: info/system.out(18368): bbbbbbbbbbb____onresume

10-10 11:55:52.062: info/system.out(18368): bbbbbbbbbbb____onpause      // 從tabb切換到tabc(tabb調用onpause)

10-10 11:55:52.062: info/system.out(18368): extra---- 2 checked!!!

10-10 11:55:52.082: info/system.out(18368): cccccccccc____onattach

10-10 11:55:52.082: info/system.out(18368): cccccccccc____oncreate

10-10 11:55:52.086: info/system.out(18368): cccccccccc____oncreateview

10-10 11:55:52.090: info/system.out(18368): cccccccccc____onactivitycreated

10-10 11:55:52.090: info/system.out(18368): cccccccccc____onstart

10-10 11:55:52.090: info/system.out(18368): cccccccccc____onresume

10-10 11:56:06.535: info/system.out(18368): cccccccccc____onpause      // 從tabc切換到tabb(tabc調用onpause)

10-10 11:56:06.535: info/system.out(18368): bbbbbbbbbbb____onresume    // 從tabc切換到tabb(tabb調用onresume)

10-10 11:56:06.535: info/system.out(18368): extra---- 1 checked!!!

好了,到此為止,我們已經用fragment實作了類似tabhost的功能了,下面來看下各個fragment之間的通信

現在的情況是tabafm中有個edittext,tabbfm中有個button,mainactivity中有個變量“hello”

要做的是,切換到taba,輸入“i'm taba”,切換到b,點選button後,toast顯示“hello i'm taba”

mainactivity中沒什麼好說的,就一個hello變量:

tabafm在布局檔案tab_a.xml中加個edittext,設定個id就可以了

tabbfm中:

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信
Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

通過getactivity()即可得到fragment所在的fragmentactivity

最終效果圖:

Android使用Fragment來實作TabHost的功能(解決切換Fragment狀态不儲存)以及各個Fragment之間的通信

繼續閱讀