天天看點

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

今天來實作下ViewPager的功能,google提供了一個FragmentPagerAdapter這麼一個擴充卡,蛋疼的是,碰到了跟上次類似的問題。比如ViewPager有5個page,剛打開的時候,會加載page1和page2,我們手動切換到page2的時候,會加載page3,切換到page3的時候,加載page4的同時會destory掉page1,是以,還是面臨同樣的問題,page的狀态無法儲存,于是,咱還是自己來實作下好了,自己動手,豐衣足食嘛!(同樣 有朋友知道解決辦法的話,希望聯系我,賜教下哈)

先來看下整個demo的結構,跟上次實作TabHost的例子差不多:

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

TabAFm到TabEFm都是Fragment,并且每個Fragment對應一個布局檔案。

TabAFm.java:

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

View Code

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

tab_a.xml布局中有個EditText

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

現在來看MainActivity:

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

MainActivity上述代碼所示

MainActivity是包含Fragment的Activity(也就是這裡的5個Fragment)

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

用一個List<Fragment>去維護5個Fragment,也就是5個page。

MainActivity的布局很簡單,就一個ViewPager,main.xml如下:

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

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

現在看下FragmentViewPagerAdapter:

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

這裡解決Fragment切換重新加載布局的辦法,用的是把幾個Fragment全部Add,然後根據要顯示的哪個Fragment就把哪個Fragment的View給添加到“ViewGroup container”上去。

效果輸出:

// 以下打開程式後,加載PageA和PageB

10-12 09:42:46.671: INFO/System.out(27248): AAAAAAAAAA____onAttach

10-12 09:42:46.671: INFO/System.out(27248): AAAAAAAAAA____onCreate

10-12 09:42:46.671: INFO/System.out(27248): AAAAAAAAAA____onCreateView

10-12 09:42:46.761: INFO/System.out(27248): AAAAAAAAAA____onActivityCreated

10-12 09:42:46.765: INFO/System.out(27248): AAAAAAAAAA____onStart

10-12 09:42:46.765: INFO/System.out(27248): AAAAAAAAAA____onResume

10-12 09:42:46.847: INFO/System.out(27248): BBBBBBBBBBB____onAttach

10-12 09:42:46.847: INFO/System.out(27248): BBBBBBBBBBB____onCreate

10-12 09:42:46.851: INFO/System.out(27248): BBBBBBBBBBB____onCreateView

10-12 09:42:46.867: INFO/System.out(27248): BBBBBBBBBBB____onActivityCreated

10-12 09:42:46.867: INFO/System.out(27248): BBBBBBBBBBB____onStart

10-12 09:42:46.867: INFO/System.out(27248): BBBBBBBBBBB____onResume

// 以下切換到PageB

10-12 09:42:57.285: INFO/System.out(27248): AAAAAAAAAA____onPause    // 切換到PageB前會調用PageA的onPause()方法

10-12 09:42:57.285: INFO/System.out(27248): BBBBBBBBBBB____onResume  // 切換到PageB後會調用PageB的onResume()方法

10-12 09:42:57.285: INFO/System.out(27248): Extra...i: 1            // 切換頁面時會調用切換額外功能接口(使用者可以自己寫需要的邏輯)

10-12 09:42:57.582: INFO/System.out(27248): CCCCCCCCCC____onAttach    // 切換到PageB後會加載PageC

10-12 09:42:57.586: INFO/System.out(27248): CCCCCCCCCC____onCreate

10-12 09:42:57.586: INFO/System.out(27248): CCCCCCCCCC____onCreateView

10-12 09:42:57.675: INFO/System.out(27248): CCCCCCCCCC____onActivityCreated

10-12 09:42:57.675: INFO/System.out(27248): CCCCCCCCCC____onStart

10-12 09:42:57.675: INFO/System.out(27248): CCCCCCCCCC____onResume

// 以下切換到PageC

10-12 09:43:18.261: INFO/System.out(27248): BBBBBBBBBBB____onPause     // 切換到PageC前會調用PageB的onPause()方法

10-12 09:43:18.261: INFO/System.out(27248): CCCCCCCCCC____onResume    // 切換到PageC後會調用PageC的onResume()方法

10-12 09:43:18.261: INFO/System.out(27248): Extra...i: 2              // 切換頁面時會調用切換額外功能接口(使用者可以自己寫需要的邏輯)

10-12 09:43:18.726: INFO/System.out(27248): DDDDDDDDD____onAttach      // 切換到PageC後會加載PageD

10-12 09:43:18.726: INFO/System.out(27248): DDDDDDDDD____onCreate

10-12 09:43:18.726: INFO/System.out(27248): DDDDDDDDD____onCreateView

10-12 09:43:18.738: INFO/System.out(27248): DDDDDDDDD____onActivityCreated

10-12 09:43:18.738: INFO/System.out(27248): DDDDDDDDD____onStart

10-12 09:43:18.742: INFO/System.out(27248): DDDDDDDDD____onResume

10-12 09:43:20.742: INFO/System.out(27248): CCCCCCCCCC____onPause      // 切換到PageB前會調用PageC的onPause()方法

10-12 09:43:20.742: INFO/System.out(27248): BBBBBBBBBBB____onResume    // 切換到PageB後會調用PageB的onResume()方法

10-12 09:43:20.746: INFO/System.out(27248): Extra...i: 1              // 切換頁面時會調用切換額外功能接口(使用者可以自己寫需要的邏輯)

好了,到此為止,我們已經用Fragment實作了ViewPager的功能了,同樣,下面來看下各個Fragment之間的通信

現在的情況是TabAFm中有個EditText,TabBFm中有個Button,MainActivity中有個變量“hello”

要做的是,切換到A,輸入“I'm PageA”,切換到B,點選Button後,Toast顯示“hello I'm PageA”

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

TabBFm中:

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

最終效果圖:

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

繼續閱讀