
前言:
上面動(dòng)圖中滑動(dòng)切換頁面就是用到 VIewPager,也可以當(dāng)作演示幻燈片,制作使用引導(dǎo)。而最上面的標(biāo)簽就是用到 ActionBar 的 Tab,與 ViewPager 關(guān)聯(lián)后可以點(diǎn)擊切換頁面,最下面的控件是 PagerTitleStrip,用來顯示當(dāng)前頁面所在的標(biāo)簽名。
?由于Google官方建議用 Toolbar 代替 Actionbar,Toolbar也確實(shí)比 ActionBar好用,所以ActionBar 的Tab就不好用了,取而代之的是 support design 里的 TabLayout,怎么用呢,看我這個(gè)帖子:TabLayout ViewPager快速實(shí)現(xiàn)滑動(dòng)切換頁面及對(duì)應(yīng)標(biāo)簽
學(xué)習(xí)使用 ViewPager:
首先直接在主布局中寫入:

ViewPager布局好了,那接下來怎么用呢, ViewPager 劃動(dòng)的頁面其實(shí)是一個(gè)個(gè)的 Fragment ,所以 ViewPager 需要和 Fragment 建立關(guān)聯(lián),那誰來處理 ViewPager 和 Fragment 的關(guān)聯(lián)呢,使用 PagerAdapter ,最后調(diào)用 ViewPager 的 setAdapter()方法 ,設(shè)置關(guān)聯(lián)。
官方提供了兩個(gè) PagerAdapter :

- FragmentPagerAdapter:適合切換的pages較少的
- FragmentStatePagerAdapter:適合未知pages多少,用戶切換到其他 pages 時(shí),會(huì)destroy對(duì)應(yīng)的Fragment減少內(nèi)存占用
這里我們因?yàn)橹伙@示幾個(gè),選擇繼承 FragmentPagerAdapter,在實(shí)現(xiàn)適配器之前我們先把 Fragment 寫好:


我們使用同一個(gè) Fragment,但是new Fragment 時(shí)通過 Bundle 來設(shè)置每一個(gè) Fragment 的TextView顯示當(dāng)前是第幾個(gè) Fragment,接下來實(shí)現(xiàn)我們的 FragmentPagerAdapter,新建 MyFragmentAdapter 繼承 FragmentPagerAdapter,并且實(shí)現(xiàn)其中幾個(gè)重要方法:

適配器通過 getCount 返回的數(shù)來確定調(diào)用 getItem() 的次數(shù),這里返回 3 (這里寫死了,實(shí)際可以靈活控制),代表新建三個(gè) Fragment,ViewPager的 pages 也就是三個(gè),getPageTitle()方法也是重要的一個(gè)方法,在后面講到的 PagerTitleStrip 就是使用這個(gè)函數(shù)來確定 tab 的文本。 實(shí)現(xiàn)了 MyFragmentAdapter 后我們就可以開始建立關(guān)聯(lián)了。
回到 Activity 的 onCreate() 方法:

- 獲取 ViewPager 的 id。
- 實(shí)例化我們的 MyFragmentAdapter ,getSupportFragmentManager()傳入FragmentManager。
- viewPager 設(shè)置適配器為我們的 MyFragmentAdapter
到這 ViewPager 的基本用法就學(xué)完了,效果如下:

ActionBar.Tab 與 ViewPager關(guān)聯(lián):
- ActionBar actionBar = getSupportActionBar();獲取 ActionBar對(duì)象
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 設(shè)置渲染 Tabs
- 通過 actionBar.newTab() .setIcon().setText() 方法獲取 tab實(shí)例,然后 actionBar.addTab(tab) 把 tab 加入 ActionBar,addTab幾個(gè),就加入幾個(gè)標(biāo)簽。
思路就是這樣,然而這樣的 Tab 點(diǎn)擊并沒有反映,因?yàn)槲覀冞€沒實(shí)現(xiàn)Tab的點(diǎn)擊事件,通過 ActionBar.TabListener 實(shí)現(xiàn)點(diǎn)擊事件,代碼如下:

- 在 onTabSelected() 事件中,點(diǎn)擊第幾個(gè) Tab 我們就通過 viewPager.setCurrentItem(tab.getPosition()) 方法切換到第幾個(gè) Item(Fragment)。
- 在 for 循環(huán)中以 我們的 MyFragmentAdapter 適配器里的 getCount() 方法返回的數(shù)來確定 add 入幾個(gè) Tab,且在 ActionBar.newTab 方法中設(shè)置監(jiān)聽器。
到這里我們的 Tab 就可以顯示且點(diǎn)擊切換頁面了,效果如下:

但是問題又來了,滑動(dòng) ViewPager 可以切換 Item,但是上面的 Tab 卻不會(huì)自動(dòng)跳轉(zhuǎn)到相應(yīng)的 Tab標(biāo)簽下,這里是需要監(jiān)聽 ViewPager 切換頁面的動(dòng)作,通過 ViewPager.OnPageChangeListener(),代碼如下:

- 在 onPageSelected() 方法中設(shè)置 Item 所對(duì)應(yīng)的 ActionBar.Tab,參數(shù) position 對(duì)于 ActionBar.Tab 和 我們 ViewPager 的 Item 都是一一對(duì)應(yīng)的,因?yàn)?Tab , Item 都為三個(gè)。
到這里我們ActionBar Tab 和 ViewPager的關(guān)聯(lián)就完成了,最后再講一個(gè) PagerTitleStrip
PagerTitleStrip 的簡單使用:
使用 PagerTitleStrip 非常簡單,直接在 ViewPager 的布局中加入:

- android:layout_gravity="bottom" 設(shè)置顯示在底部
效果圖:

通過設(shè)置在 ViewPager 布局中,就完成 PagerTitleStrip 和 ViewPager 的綁定,會(huì)發(fā)現(xiàn) PagerTitleStrip 自動(dòng)顯示標(biāo)簽名,這是回調(diào)了我們 MyFragmentAdapter 重寫的 getPageTitle(int position) 方法來獲取相應(yīng)的標(biāo)簽名。
到這里就結(jié)束了,如果對(duì)你有幫助請(qǐng)點(diǎn)擊 喜歡 哦,也歡迎到我 GitHub 點(diǎn) star
Demo地址:
GitHub地址:https://github.com/RunHuaOil/AndroidPractice/tree/master/ViewPagerTest