1. 程式人生 > >Fragment與ViewPager的結合做出區域性滑動重新整理頁面,以及關於app.FragmentManager和v4包的FragmentPagerAdapter衝突

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.ViewPager
android: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包了

這個是很詳細的一篇

教你如何使用ViewPager+Fragment一步步打造頂部導航介面滑動效果

http://blog.csdn.net/it_zjyang/article/details/51584439