作者簡介? 原創(chuàng)微信公眾號郭霖 WeChat ID: guolin_blog
效果圖
上圖效果大家應(yīng)該都很熟悉了秒咐,基本市面上的App都會用到這種布局效果氨鹏,實(shí)現(xiàn)起來也很簡單,就是上面一個(gè) ViewPager卿嘲,下面一個(gè)線性布局
TabContainerView 就是把實(shí)現(xiàn)邏輯封裝起來大刊,讓開發(fā)者可以通過更簡單的代碼實(shí)現(xiàn)這種布局效果,提高工作效率敌蜂。
使用
就是這么簡單箩兽,調(diào)用兩行代碼就可以實(shí)現(xiàn)了,不過需要我們自己創(chuàng)建一個(gè)適配器章喉,MainTabContainerAdapter 就是自己創(chuàng)建的汗贫,它需要繼承 BaseAdapter 來實(shí)現(xiàn)里面的抽象方法,BaseAdapter 是此項(xiàng)目當(dāng)中自定義的抽象類秸脱。
思路
TabContainerView 是一個(gè) RelativeLayout 布局落包,整個(gè)布局由兩部分組成:底部布局摊唇,內(nèi)容布局
底部布局為一個(gè) LinearLayout 布局咐蝇,里面的單個(gè) Tab 也是一個(gè) LinarLayout 布局;中間的內(nèi)部區(qū)域是一個(gè) ViewPager巷查。
實(shí)現(xiàn)
項(xiàng)目由6個(gè)類組成:
我們先來分析調(diào)用的第一行代碼
TabContainerViewtabContainerView=(TabContainerView) findViewById(R.id.container_tab);
看看它的構(gòu)造方法:
構(gòu)造方法調(diào)用了init方法:
分別初始化了自定義屬性有序,底部的 TabHost,分割線岛请,ViewPager 等旭寿;initStyle 就是初始化一些自定義的屬性,沒啥好說的崇败;我們來看下 initTabHost 方法:
initTabHost方法里創(chuàng)建了一個(gè) TabHost盅称,TabHost 的構(gòu)造方法里調(diào)用initView方法,方法創(chuàng)建 RootView 布局后室,設(shè)置長寬, 位置等屬性缩膝,然后把 TabHost 的根布局添加到 TabContainerView 布局當(dāng)中。
initDivideLine 方法創(chuàng)建一個(gè)分割線View添加到布局當(dāng)中
initViewPager 方法創(chuàng)建一個(gè)ViewPager添加到布局當(dāng)中
下面再來看看第二行代碼
里面做了些什么事情:
BaseAdapter 是個(gè)抽象類:
它提供了容器當(dāng)中需要的文本咧擂,圖片逞盆,還有內(nèi)容區(qū)的 fragment 信息
方法里調(diào)用 TabHost 的 addTabs 方法給 TabHost 添加 Tab
通過方法得到文本,圖片等數(shù)組松申,然后通過循環(huán)創(chuàng)建 Tab 對象云芦,添加到 TabHost 布局當(dāng)中俯逾,我們來看看 Tab?的構(gòu)造方法:
Tab 的構(gòu)造方法就是給文本和圖片的屬性設(shè)值,添加監(jiān)聽舅逸,創(chuàng)建Tab需要的文本桌肴,圖片布局。接下來給 ViewPager 設(shè)置適配器琉历,添加 fragment
contentViewPager.setAdapter(newTabViewPagerAdapter(baseAdapter.getFragmentManager(), baseAdapter.getFragmentArray()));
這樣底部的 Tab 和內(nèi)容區(qū)域的 ViewPager 數(shù)據(jù)都填充完成了
接下來需要設(shè)置點(diǎn)擊狀態(tài)的切換坠七,從 Tab類 的 init方法 里可以看出給 RootView 添加了點(diǎn)擊事件,onClick 方法會調(diào)用 TabHost 設(shè)置給 Tab 的監(jiān)聽回調(diào)類旗笔,下面的代碼就是 TabHost 給 Tab 添加的監(jiān)聽:
onTabSelected 方法里設(shè)置 contentViewPager 當(dāng)前選中的 Item彪置,然后會回調(diào)到 ViewPager 監(jiān)聽類 OnPageChangeListener的onPageSelected 方法:
首先調(diào)用 onChangeTabHostStatus 方法:
循環(huán) TabList,根據(jù) index 判斷 Tab 狀態(tài)的選中與否然后調(diào)用回調(diào)監(jiān)聽 onTabSelectedListener 的 onTabSelected方法
到此為止整個(gè)項(xiàng)目的實(shí)現(xiàn)過程就分析完了蝇恶。
文章原創(chuàng)作者GuoLin 書籍推薦
郭林大神原創(chuàng)android 書籍:《第一行代碼 android》