當前位置:
首頁 > 最新 > Fragment 番外篇——TabLayout+ViewPager+Fragment

Fragment 番外篇——TabLayout+ViewPager+Fragment

關注 code小生 ,每日一篇技術推送!

作者:忘了12138

地址:http://www.cnblogs.com/wangle12138/p/8419496.html

聲明:本文是 忘了12138 原創投稿,轉發等請聯繫原作者授權。

該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡量按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相關知識,另外也借鑒了其他的優質博客,在此向各位大神表示感謝,膜拜!!!

前言

上一篇文章中我們使用底部導航+Fragment的方式實現了Android主流App中大都存在的設計。並命名其為「Fragment最佳實踐」,作為想到單獨使用Fragment的用戶來說,這個說法並不誇大,它解決了許多用戶在使用Fragment時產生的這樣那樣可見或不可見的問題。不過Fragment還有其他的使用方式,就是我們本章要介紹的。(本來是介紹ListView的,等著ListView的讀者不好意思了,我會很快更新的。)

註:為什麼臨時插入這一章,因為有讀者在上一篇文章中評論了,我覺得大有道理,感謝

這裡我就不打碼了,,哈哈哈哈

TabLayout


TabLayout是Android 5.0之後Google提供的一系列Material Design設計規範中的一個控制項。我們在布局文件中可以這樣使用。

TabLayout間接繼承於ViewGroup,其內可包含0到n個TabItem,這個TabItem就是我們經常使用的標籤,其是個自定義View,這樣我們就定義了一個包含3個標籤頁的TabLayout。其運行結果如下圖:

TabLayout的動態使用

在布局文件中我們可以很方便定義頂部/底部 導航的布局。我們來看一下在代碼中的使用

關於運行結果我就不上圖了,跟上面的運行結果是一樣的。

TabLayout的更多屬性

關於TabLayout的更多屬性以及使用的說明請查看其官方文檔。在這裡我們只關心TabLayout+ViewPager的化學反應,這個組合也是我們平常在開發中使用最多的。在此之前我們先介紹ViewPager

ViewPager

先看看官方對ViewPager的說明

上面英文的大致意思是ViewPager是一個布局管理類,這個類呢允許用戶左右翻轉頁面。你必須實現一個PagerAdapter來生成這些顯示的頁面。ViewPager經常和Fragment一起使用。而且呢Google非常貼心的提供了兩個類FragmentPagerAdapter和FragmentStatePagerAdapter來應付那些一般場景。

其實從ViewPager的說明中,我們基本上就能知道ViewPager是什麼以及如何使用了。

PagerAdapter

ViewPager繼承於ViewGroup,官方指導中就說了,你要自己實現PagerAdapter來生成顯示的頁面,那麼我們來看看這個PagerAdapter

其實我們在看一個不太了解的類的時候,通過源碼上的關於這個類的說明就可以知道很多信息了。關於PagerAdapter的說明就是如此。

先說了一下PagerAdapter的作用,是一個基類提供適配器給ViewPager中的頁面,如果你想使用特定的實現類,那麼你可以看兩個類FragmentPagerAdapter和FragmentStatePagerAdapter,這兩個類繼承了PagerAdapter,並實現了其抽象方法。

後面一段的意思是你如果想自定義你自己的PagerAdapter,那麼你最少要實現這4個方法

instantiateItem(ViewGroup, int)

destroyItem(ViewGroup, int, Object)

getCount()

isViewFromObject(View, Object)

下面我們以代碼的形式,說明這4個方法的含義以及如何使用

這4個方法是必須的,,另外還有一些不是必須,但是可能會用到的

FragmentPagerAdapter

上面呢只是列舉說明了一下PagerAdapter,看起來有些枯燥,都是些說明,那麼我們來看一下實踐,ViewPager通暢跟Fragment一起使用,即其所管理的頁面通暢是Fragment,所以Google提供了兩個適配器FragmentPagerAdapter和FragmentStatePagerAdapter,我們這節分析FragmentPagerAdapter。

代碼比較少,總共也就100多行,邏輯也比較清晰明了,我們來著重分析instantiateItem和destroyItem

instantiateItem方法主要功能是為ViewPager生成Item。

那麼destroyItem方法的主要功能是銷毀ViwePager內的Item

FragmentStatePagerAdapter

關於FragmentStatePagerAdapter,讀者可自行分析,代碼也不長。需要注意的地方是,兩者對於destroyItem的不同實現

小結

ViewPager 是個 ViewGroup,與其他布局 LinearLayout 或者其他任意的ViewGroup並無本質的不同,它被Google建議與Fragment結伴使用,也是說ViewPager所包裹的是Fragment布局。ViewPager需要適配器PagerAdapter操作Fragment,這一點就像ListView需要適配器操作其內部的Item一樣。

適配器PagerAdapter是個抽象類,並且依照官方說明,我們必須至少實現其4個重要方法。4個方法可能太多,所以Google提供了FragmentPagerAdapter以及FragmentStatePagerAdapter,這兩個也是抽象類,不過我們的自定義Adapter只需要實現其中的getItem(int position)方法即可。

關於FragmentPagerAdapter以及FragmentStatePagerAdapter的不同,我這裡再總結一下。FragmentPagerAdapter銷毀item的時候最終調用FragmentTransaction的detach()方法,使用detach()會將view從viewtree中刪除,和FragmentStatePagerAdapter中使用的remove()不同,此時fragment的狀態依然保持著,在使用attach()時會再次調用onCreateView()來重繪視圖,注意使用detach()後fragment.isAdded()方法將返回false。

實例

更改後的TabActivity對應的布局文件

更改後的TabActivity

而我們自定義的MyPagerAdapter也非常簡單

ViewPager預載入與懶載入


ViewPager可通過setOffscreenPageLimit(int limit)函數設置ViewPager預載入的View數目

本篇總結

我們在本篇博客中比較詳細的探討了TabLayout+ViewPager+Fragment的使用,我們在許多主流App中都能看到這種頂部、底部導航的效果,並且在此基礎上我們探討了TabLayout+ViewPager+Fragment懶載入問題。

下篇預告

下篇打算往Fragment中加點東西,ListView


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 code小生 的精彩文章:

MVI 設計模式嘗鮮

TAG:code小生 |