Fragment與ViewPager的結合做出區域性滑動重新整理頁面,以及關於app.FragmentManager和v4包的FragmentPagerAdapter衝突
ViewPager+Fragment可以做出多頁面滑動效果,讓我們的應用程式介面操作起來更加靈活
一.首先來說說Fragment
支援Fragment的有兩個包
importandroid.support.v4.app.Fragment;
importandroid.app.Fragment;
fragment有android.support.v4.app.fragment包和android.app.fragment之分,它倆的區別在於:
android.app.fragment包是是3.0以後的系統才能使用的,也就是說3.0以前的系統是沒法體驗到這個包的功能。
而android.support.v4.app.fragment包是為了向下相容,使低版本(到1.6版本)也能體驗到fragment的功能。
推薦使用v4包下的,這樣可以使APP適應更多機型。
它倆在使用上也是有區別的:
1.首先一點是在管理fragment的主activity上, app包下的照樣繼承Activity,但是v4包下的需要繼承FragmentActivity,
2.對FragmentManager的獲取,在app包下需要使用getFragmentManager(),如下:
FragmentMagnager fm=getFragmentManager();
- 1
在v4包下需要使用getSupportFragmentManager()來獲取管理,程式碼如下:
FragmentMagnager fm=getSupportFragmentManager();
- 1
3.我們把用來顯示特定的fragment的動作稱之為事務,事務通過FragmentTransaction來執行,用以下方法對FragmentTransaction進行例項化:
FragmentTransaction transaction=fragmentManager.beginTransaction();
- 1
然而v4包與app包的區別在於,v4包必須事務新增完fragment後加上commit();顧名思義,commit是提交的意思,我們對事務新增的所有動作最後都要提交,即新增完事務的最後一定要執行transaction.commit();不然會導致異常。
我建議大家使用v4包。
二.再來說說ViewPager
ViewPager是個功能非常強大的UI元件,應用非常的廣泛,用於頁面的滑動。
使用ViewPager的步驟:
1.現在佈局檔案中新增ViewPager
<android.support.v4.view.ViewPagerandroid:id="@+id/viewPager" android:layout_width="wrap_content" android:layout_height="440sp"> </android.support.v4.view.ViewPager>
2.建立介面卡,得繼承PagerAdapter
3.Activity檔案中根據id獲取ViewPager
獲取你需要滑動的View
建立List<View> list,並將你的View放入list,然後與例項化你的介面卡,並與ViewPager配置好
三.ViewPager與Fragment
在實際的開發中,這兩者的組合是使用比較常見的,對於Fragment,使用的介面卡是FragmentStatePagerAdapter或者FragmentPagerAdapter,兩者的區別http://blog.csdn.net/hknock/article/details/46741573
主要說一下這個坑:
有次用getFragmentManager()得到FragmentManager不能放到FragmentPagerAdapter裡面去.因為FragmentPagerAdapter裡面構造引數必須是v4包下的FragmentManager,而我activty裡面getFragmentManager得到是app包下的FragmentManager 產生衝突 。
那問題總結下:
因為是最低版本4.3所以我用到fragment時候不想用fragmentactivity 直接用actiity多方便定義基類也方便多了.
問題是fragment的FragmentPagerAdapter介面卡預設需要傳一個引數必須是v4包的FragmentManager,而我用的activity得到的FragmentManager是app包下的
這下凌亂.而發現app包下根本沒有FragmentPagerAdapter..真是差點沒罵谷歌腦殘..
解決方法 直接去v4報下找到FragmentPagerAdapter原始碼把他全部複製下來自己建立一個類,把裡面所有匯入FragmentManager的改成app包下的 這樣就解決了,
,最後還是不相信谷歌有這麼腦殘,終於找到在v13包下的FragmentPagerAdapter 這個類用到FragmentManager是app包下的FragmentManager,那就把v13包倒進來
就可以輕鬆使用actvity類來得到FragmentManager實現 ,
萬一你覺得用v13包只用了這麼一個類浪費 那就直接把v13包的FragmentPagerAdapter拉下來複制一份就省略了
而我在匯入v13包後,莫名其妙R爆紅,v13似乎不太靠譜。
最終我自個的解決方法就是把app包換成的v4包用,幾個地方改一改
MainActivity extends FragmentActivity
FragmentManager fm=getSupportFragmentManager();
等。。
以後我都不再用app包了
這個是很詳細的一篇