利用TabLayout和fragment搭建app框架

最近閑來無事,就想學(xué)習(xí)一下android 新出的tablayout控件浑度,原先是用radioGroup+fragment,于是我重新用tablayout+fragment重構(gòu)了一下。因?yàn)閠ablayout是support design包的,因此需要在build.gradle文件中添加:

compile'com.android.support:design:23.3.0'

按照國際慣例挟秤,先上圖:


效果圖

我們先開始寫布局

xml version="1.0"encoding="utf-8"?><LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"

? ? ? ? ?android:layout_width="match_parent"

? ? ? ? android:layout_height="match_parent"

? ? ? ? ?android:orientation="vertical">

? ? ?<RelativeLayout ?android:id="@+id/main_client"

? ? ? ? ? ? android:layout_width="match_parent"

? ? ? ? ? ? android:layout_height="0px"

? ? ? ? ? ? android:layout_weight="1"/>

? ? <android.support.design.widget.TabLayout

? ? ? ? ? ?android:id="@+id/main_tablayout"

? ? ? ? ? android:layout_width="match_parent"

? ? ? ? ? android:layout_height="wrap_content"

? ? ? ? ? android:background="@color/color_title_bar"/>

</LinearLayout>

布局很簡(jiǎn)單,就包括一個(gè)相對(duì)布局和一個(gè)tablayout控件,寫好之后呢抄伍,我就想著艘刚,tablayout如何設(shè)置相應(yīng)的屬性,比如選中某個(gè)tab后截珍,下方是否有選中的線攀甚,比如下圖(這是tabLayout默認(rèn)的顯示效果),如果想更改線的高度岗喉,顏色或者直接不讓線顯示秋度,該怎么辦呢?

跟蹤tablayout的源碼查看钱床,發(fā)現(xiàn)tabLayout默認(rèn)使用Widget_Design_TabLayout這個(gè)theme


tabLayout 部分源碼


widgetDesignTablayout的樣式

其中可以看到 tabGravity和tabMode這2個(gè)屬性静陈,但是我們那個(gè)選中的線的顏色和高度在哪呢?注意看它還有個(gè)父類诞丽,繼續(xù)跟蹤:


看到一個(gè)tabIndicatorColor屬性,猜想一下拐格,這個(gè)是否就是選中線的顏色僧免?那個(gè)height是否是選中的線的高度?于是查看一下


發(fā)現(xiàn)還真是捏浊,高度同理懂衩,我就不帶著大家看了,因此我們?nèi)绻氚堰x中的線的顏色去掉金踪,就可以把高度浊洞,設(shè)置為0就行了,因此如果想要定制tab的一些屬性胡岔,比如顏色法希,選中的字體的顏色等,就可以寫下屬性:


比如我的項(xiàng)目里靶瘸,就加了一個(gè)style苫亦,來得到我需要的效果

其中style為:在res/values/styles目錄下

<--主界面tablayout-->

<style ?name="MainTabLayout">

? ? ? <item ?name="tabIndicatorColor">@android:color/transparent ?</item>

? ? ? <item ?name="tabIndicatorHeight">0dp ?</item>

? ? ?<item ?name="tabPaddingStart">12dp ?</item>

? ? ?<item ?name="tabPaddingEnd">12dp </item>

</style>

這些屬性具體代表什么意思毛肋,請(qǐng)參考?安卓developer


第二步:寫activity

因?yàn)橛玫搅薴ragment,所以我這里用到了FragmentPagerAdapter

廢話不多說了屋剑,直接上代碼吧


tabLayout.setTabMode()這個(gè)是tab的模式润匙,有4種模式,如下圖:

tab模式

這個(gè)模式也可以在xml中設(shè)置


給tablayout設(shè)置導(dǎo)航欄


因?yàn)槭褂昧薴ragment唉匾,所以這里使用了FragmentPagerAdapter來管理fragment

mainPageAdapter

tabLayout已經(jīng)初始化好了tab孕讳,fragment也已經(jīng)初始化好了,現(xiàn)在需要將fragment與container綁定(container即為相對(duì)布局巍膘,也就是中間顯示的那塊),當(dāng)點(diǎn)擊切換tab時(shí)厂财,container顯示對(duì)應(yīng)的fragment

來實(shí)現(xiàn)點(diǎn)擊切換tab的操作:

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

@Override

public void onTabSelected(TabLayout.Tab tab) {

int position = tab.getPosition();

Fragment fragment = (Fragment)adapter.instantiateItem(container, position);

adapter.setPrimaryItem(container, pos, fragment);

adapter.finishUpdate(container);

}

@Override

public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

public void onTabReselected(TabLayout.Tab tab) {

}

});

給tabLayout加個(gè)切換的監(jiān)聽,setOnTabSelectedListener這個(gè)監(jiān)聽典徘,看名字就能大概猜出來是什么意思蟀苛,就是當(dāng)tab頁面被選中時(shí),會(huì)調(diào)用這個(gè)方法逮诲,當(dāng)tab頁面被選中時(shí)帜平,切換目前的fragment。并且將container與fragment聯(lián)合在一起了

還有一個(gè)問題梅鹦,就是裆甩,第一次進(jìn)頁面,如何顯示默認(rèn)選中的頁面齐唆?

我們看到代碼中的initTab中嗤栓,里面有個(gè)

這段代碼,就是給tabLayout加上tab箍邮,并且后面的第二個(gè)參數(shù)茉帅,當(dāng)i==0的時(shí)候,給了true锭弊,其他都是false堪澎,查看源碼發(fā)現(xiàn),最后會(huì)執(zhí)行下面這段代碼:

因此會(huì)回調(diào)我們寫的那個(gè)onTabSelected方法,會(huì)默認(rèn)選擇第一個(gè)

總結(jié):

一味滞、在xml里定義 tabLayout樱蛤,相對(duì)布局

二、在代碼里剑鞍,給tablayout add 上tab昨凡,并且寫上一個(gè)用于管理fragment的adapter

三、給tablayout加個(gè)監(jiān)聽蚁署,用于切換tab時(shí)便脊,顯示切換的那個(gè)fragment

注意:

要在fragment里面,加上這段代碼光戈,如果不加的話就轧,會(huì)出現(xiàn)fragment重疊的現(xiàn)象证杭,


跟蹤下 ?adapter.setPrimaryItem(mContainer, pos, fragment) ??源碼,

發(fā)現(xiàn)這段代碼是用來控制哪個(gè)fragment'顯示妒御,哪個(gè)隱藏解愤,所以要在每個(gè)fragment里加上 那段代碼,否則都會(huì)顯示乎莉,就出現(xiàn)重疊的現(xiàn)象


終于寫完了送讲,類似我了,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惋啃,一起剝皮案震驚了整個(gè)濱河市哼鬓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌边灭,老刑警劉巖异希,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绒瘦,居然都是意外死亡称簿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門惰帽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憨降,“玉大人,你說我怎么就攤上這事该酗∈谝” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵呜魄,是天一觀的道長(zhǎng)悔叽。 經(jīng)常有香客問我,道長(zhǎng)爵嗅,這世上最難降的妖魔是什么骄蝇? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮操骡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赚窃。我一直安慰自己册招,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布勒极。 她就那樣靜靜地躺著是掰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辱匿。 梳的紋絲不亂的頭發(fā)上键痛,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天炫彩,我揣著相機(jī)與錄音,去河邊找鬼絮短。 笑死江兢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丁频。 我是一名探鬼主播杉允,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼席里!你這毒婦竟也來了叔磷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤奖磁,失蹤者是張志新(化名)和其女友劉穎改基,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咖为,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秕狰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了案疲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片封恰。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖褐啡,靈堂內(nèi)的尸體忽然破棺而出诺舔,到底是詐尸還是另有隱情,我是刑警寧澤备畦,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布低飒,位于F島的核電站,受9級(jí)特大地震影響懂盐,放射性物質(zhì)發(fā)生泄漏褥赊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一莉恼、第九天 我趴在偏房一處隱蔽的房頂上張望拌喉。 院中可真熱鬧,春花似錦俐银、人聲如沸尿背。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽田藐。三九已至桌吃,卻和暖如春瘦材,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工失暴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乱豆,地道東北人闲坎。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓崭闲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親啡直。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烁涌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容