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

TabAFm到TabEFm都是Fragment,并且每個Fragment對應一個布局檔案。
TabAFm.java:
View Code
如上述代碼所示,TabAFm是一個Fragment,對應的布局檔案是tab_a.xml,并實作了他的所有的生命周期回調函數并列印,便于調試
tab_a.xml布局中有個EditText
其他的Fragment大同小異,這裡就不貼出代碼了
現在來看MainActivity:
MainActivity上述代碼所示
MainActivity是包含Fragment的Activity(也就是這裡的5個Fragment)
他繼承了FragmentActivity(因為我這裡用的是android-support-v4.jar)
用一個List<Fragment>去維護5個Fragment,也就是5個page。
MainActivity的布局很簡單,就一個ViewPager,main.xml如下:
現在回到MainActivity中,下面這個FragmentViewPagerAdapter類是關鍵,是我自己編寫的用于綁定和處理fragments和ViewPager之間的邏輯關系
現在看下FragmentViewPagerAdapter:
這裡解決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中:
最終效果圖: