ViewPager 详解(五)-----使用Fragment实现ViewPager滑动
前言:前幾篇文章講解了ViewPager的普通實現方法,但Android官方最推薦的一種實現方法卻是使用fragment,下面我們使用fragment來重新實現一下第一篇《ViewPager 詳解(一)---基本入門》所實現的效果。
?
系列文章:
?
1、《ViewPager 詳解(一)---基本入門》
2、《ViewPager 詳解(二)---詳解四大函數》
3、《ViewPager 詳解(三)---PagerTabStrip與PagerTitleStrip添加標題欄的異同》
4、《ViewPager 詳解(四)----自主實現滑動指示條》
其它相關文章:
5、《Android Fragment完全解析,關于碎片你所需知道的一切》
6、《fragment中嵌套viewpager,vierpager中有多個fragment》
?
本篇效果圖:
在第一個頁面加一個Btn ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第一頁面向第二頁面滑動
??
? ? ? ? ?第二頁面向第三個頁面滑動
一、概述
從前面幾篇文章,我們知道,實現ViewPager是要有適配器的,我們前面用的適配器是PagerAdapter,而對于fragment,它所使用的適配器是:FragmentPagerAdapter.先看看官方對于這個類的解釋:(英文下面有中文解釋)
原文:
?
Class Overview
?
Implementation of?PagerAdapter?that represents each page as a?Fragment?that is persistently kept in the fragment manager as long as the user can return to the page.
This version of the pager is best for use when there are a handful of typically more static fragments to be paged through, such as a set of tabs. The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible. This can result in using a significant amount of memory since fragment instances can hold on to an arbitrary amount of state. For larger sets of pages, consider?FragmentStatePagerAdapter.
When using FragmentPagerAdapter the host ViewPager must have a valid ID set.
Subclasses only need to implement?getItem(int)?and?getCount()?to have a working adapter.
譯文:(譯的不好,大家可在評論中補充)
FragmentPagerAdapter派生自PagerAdapter,它是用來呈現Fragment頁面的,這些Fragment頁面會一直保存在fragment manager中,以便用戶可以隨時取用。
這個適配器最好用于有限個靜態fragment頁面的管理。盡管不可見的視圖有時會被銷毀,但用戶所有訪問過的fragment都會被保存在內存中。因此fragment實例會保存大量的各種狀態,這就造成了很大的內存開銷。所以如果要處理大量的頁面切換,建議使用FragmentStatePagerAdapter.
每一個使用FragmentPagerAdapter的ViewPager都要有一個有效的ID集合,有效ID的集合就是Fragment的集合(感謝夫諸同學的提示)
對于FragmentPagerAdapter的派生類,只需要重寫getItem(int)和getCount()就可以了。
二、具體實現
?
1、適配器實現——FragmentPagerAdapter
先看完整代碼,再細講:
?
[java]?view plaincopy這里有三個函數,根據第一部分的官方文檔,可知,對于FragmentPagerAdapter的派生類,只重寫getItem(int)和getCount()就可以了。
?
對于構造函數,這里申請了一個Fragment的List對象,用于保存用于滑動的Fragment對象,并在創造函數中初始化:
?
[java]?view plaincopy然后在getItem(int arg0)中,根據傳來的參數arg0,來返回當前要顯示的fragment,下面是getItem的官方解釋,難度不大,不再細講。
?
public abstract?Fragment?getItem?(int position)
Return the Fragment associated with a specified position.
最后,getCount()返回用于滑動的fragment總數;
從構造函數所以看出,我們要構造Fragment的集合才行,所以下面我們就先產生我們所需要的Fragment類;
?
2、三個Fragment類
第一個Fragment類:
XML:(layout1.xml)
?
[html]?view plaincopy 在其中加入了一個Btn
?
Java代碼:
?
[java]?view plaincopy 在onCreateView()中返回要顯示的View,上面這段代碼簡單演示了如何對視圖里的控件進行操作,難度不大,不再細講,如果對Fragment不太熟悉的同學,先看看這篇文章:《Android Fragment完全解析,關于碎片你所需知道的一切》
?
第二個Fragment類:
XML代碼:(layout2.xml)原生代碼,沒有做任何更改
?
[html]?view plaincopyjava代碼:
[java]?view plaincopy
第三個Fragment類:
?
XML代碼:(layout3.xml)同樣,原生代碼,沒做任何更改
?
[html]?view plaincopyjava代碼:
[java]?view plaincopy3、主activity實現
核心代碼:
?
?
[java]?view plaincopy?
首先有一個最值得注意的地方:Activity派生自FragmentActivity,其實這是有關Fragment的基礎知識,只有FragmentActivity才能內嵌fragment頁面,普通Activity是不行的。
這段代碼主要分為兩步,第一步:構造適配器;第二步:設定適配器。
先看構造適配器的過程:
[java]?view plaincopy 構造一個fragment列表,然后將上面的三個Fragment類對應的實例添加進去,最后生成FragAdapter實例。
至于第二步,設定適配器,沒什么好講的。
?
?
4、可能出現的問題
問題:在MainActivity中,當寫到這句:fragments.add(new Fragment1()); 向Fragment列表中添加Fragement對象實例時,會提示“無法將Fragment1()轉換為fragment”
解決辦法 :這是因為導入包不一致,一般的問題在于:在Fragment1中導入的是android.app.Fragment,?而在這里導入類確是:android.support.v4.app.Fragment,包不同當然無法轉換,統一導入為android.support.v4.app.Fragment之后就正常了.參考文章《android之cannot convert from Fragment1 to Fragment》
?
?
源碼下載地址:http://download.csdn.net/detail/harvic880925/7777849
請大家尊重原創者版權,轉載請標明出處:http://blog.csdn.net/harvic880925/article/details/38660861? 不勝感激!
轉載于:https://www.cnblogs.com/Free-Thinker/p/5480737.html
總結
以上是生活随笔為你收集整理的ViewPager 详解(五)-----使用Fragment实现ViewPager滑动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王爽《汇编语言第三版》实验10-1代码实
- 下一篇: 移动WEB前端开发资源整合