項(xiàng)目需求 - 使用TabLayout

材料設(shè)計(jì)是 google 官方在 2014 年谷歌大會(huì)上提出的界面設(shè)計(jì)規(guī)范,力求通過(guò)對(duì)光效、表面質(zhì)感低匙、運(yùn)動(dòng)感的控制旷痕,來(lái)提升安卓界面交互體驗(yàn)。

雖然 Material Design 已經(jīng)推出了三年顽冶,但是實(shí)際應(yīng)用上欺抗,Toolbar 和 TabLayout 是使用最廣泛的。由于需求强重,這段時(shí)間特意提取了 TabLayout 的代碼绞呈,對(duì)于許多只需要 Tablayout 的需求,其實(shí)不需要把整個(gè) Design 包導(dǎo)入间景,還能減小體積佃声。

鏈接:GitHub_ATabLayout


一、起因

項(xiàng)目現(xiàn)在用的是 HorizontalScrollView + ImageButton + ListView 的方式展示數(shù)據(jù)倘要,根據(jù)點(diǎn)擊來(lái)決定 ListView 顯示的數(shù)據(jù)圾亏。但是由于代碼陳舊,里面的弱標(biāo)志又太多封拧,所以希望能重構(gòu)一下代碼志鹃,讓它的可讀性更高一些,順便優(yōu)化一下交互泽西。

二曹铃、起步

有了需求,需要先寫個(gè) demo 填坑捧杉。去年的時(shí)候 TabLayout + ViewPager + PtrListView 顯示數(shù)據(jù)我是做過(guò)的陕见,因此沒有什么難度。但是到了工程里還是有了一些問題味抖。這里記錄一下评甜。

三、問題

  • 1.使用 TabLayout 一直有資源不能找到非竿,或者編譯后就報(bào)錯(cuò)( 有點(diǎn)尷尬蜕着,復(fù)現(xiàn)不出來(lái)了 )

需要使用向后兼容的 AppCompatTheme 和 AppCompatActivity。如果工程的 BaseActivity 是 Activity 的子類红柱,BaseTheme 也不是 AppCompatTheme 的子類,并且因?yàn)橐恍┨厥獾脑虿荒芨膭?dòng)的話蓖乘,可以在清單文件中注冊(cè)頁(yè)面時(shí)锤悄,在 TabActivity 下添加一條屬性:android:theme="@style/Theme.AppCompat.Light.NoActionBar"

  • 2.自定義 TabLayout 中的 TabView 時(shí),CusView 中的 ImageView 在第一次進(jìn)入頁(yè)面的時(shí)候嘉抒,不會(huì)變?yōu)?select 狀態(tài)

項(xiàng)目里我查看了 22.0.2 版本的源碼零聚,發(fā)現(xiàn)在 TabLayout.setSelectedTabView() 中并沒有對(duì) CusView 做 select 狀態(tài)的修改。換一種方式,如果直接放入 Icon隶症,發(fā)現(xiàn)除了第一次進(jìn)入政模,后面的部分都是有正常的狀態(tài)改變的。然而修改選中狀態(tài)的方法的權(quán)限卻不是公有蚂会,只能通過(guò)反射獲取淋样。或者胁住,你可以通過(guò) viewpager.setCurrentItem(1),viewpager.setCurrentItem(0),來(lái)達(dá)到目的趁猴。反正我是這么做的。= =

  • 3.項(xiàng)目中需要 TabLayout 的 indicator比 TabView 短一些

不同版本的 Design 包彪见,對(duì)于 SlidingTabStrip 的繪制方法不同儡司,主要看當(dāng)前版本下 SlidingTabStrip.setIndicatorPosition 和 SlidingTabStrip.onDraw 方法。onDraw 方法在 25.3.1 不知道為什么改名成 draw 方法了余指。如果需要修改這個(gè)效果請(qǐng)關(guān)注上面兩個(gè)方法中對(duì)應(yīng) left 和 right 的值捕犬。如果是使用 25.3.1 的版本,不妨使用我上面的鏈接酵镜,屬性等等都已經(jīng)修改好了碉碉。

四、使用

Design 包的更新速度還算可以笋婿,但是每個(gè)包總是會(huì)改動(dòng)一些方法的實(shí)現(xiàn)誉裆,起碼 22.0.1 和 25.3.1 差別還是有的,在網(wǎng)絡(luò)上缸濒,許許多多的使用教程都還是 2014 2015 年的教程足丢,嘗試了一下,許多方法的參數(shù)已經(jīng)不同了庇配,也有的權(quán)限變更斩跌,有的方法干脆就被干掉了,完全找不到存在過(guò)的痕跡捞慌,因此這里簡(jiǎn)單寫一下 25.3.1 的使用耀鸦。

1. 簡(jiǎn)單使用 TabLayout + ViewPager +Fragment

布局:

LinearLayout - vertical
==>TabLayout - main_tablayoutId
==>ViewPager - main_viewpagerId

MainActivity:

// find view
mTabLayout = ((TabLayout) findViewById(R.id.main_tablayoutId));
mViewPager = ((ViewPager) findViewById(R.id.main_viewpagerId));

// init data
final String[] titles = {"111","222","333","444","555"};// tab title
final List<Fragment> fragments = new ArrayList();// tab fragment
for (int i = 0; i < 5; i++) {
    fragments.add(new BlankFragment());
}

// 設(shè)置 viewpager 適配器
mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
    @Override
    public Fragment getItem(int position) {// 獲取 tab 對(duì)應(yīng)的 fragment
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {// 獲取 tab 對(duì)應(yīng)的 title
        return titles[position];
    }
});

mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);// 設(shè)置排列模式 (充滿 - 居中)
mTabLayout.setTabMode(TabLayout.MODE_FIXED);// 設(shè)置滾動(dòng)模式 (固定 - 滾動(dòng))
mTabLayout.setupWithViewPager(mViewPager);// 需要在 viewpager 設(shè)置適配器之后
2.TabLayout 屬性介紹
// 常用
// 指示器
tabIndicatorHeight
tabIndicatorColor
// 文字 - 在沒有設(shè)置 CustomView 的時(shí)候有效
tabTextColor
tabSelectedTextColor
// 背景
tabBackground
// 模式
tabMode
tabGravity

// tabview 的 padding 值比較大時(shí)會(huì)填掉 tabview 的內(nèi)容布局,tablayout 的高度并不會(huì)變化(內(nèi)部有一個(gè) defaultHeight 值啸澡,決定了 tablayout 的高度)
tabPadding
tabPaddingStart
tabPaddingTop
tabPaddingEnd
tabPaddingBottom

// text 的樣式
tabTextAppearance
// 第一個(gè) tab 距離左邊的偏移距離
tabContentStart
// tab 最小寬度
tabMinWidth

五袖订、關(guān)于自定義 TabView

鏈接:Android Design Support Library系列之一:TabLayout的使用
上面的文章我覺得寫得總結(jié)得很到位了,我就不再班門弄斧嗅虏。但是文章最后寫的關(guān)于 indicator 寬度的設(shè)置部分提到了一個(gè)方法 setIndicator(tablayout, marginLeft, marginRight) 洛姑,這個(gè)方法在我現(xiàn)在使用的 25.3.1 版本中并沒有,所以才做了上面的提取操作皮服。有可能還會(huì)有其他方法的不同楞艾,各位看官望知悉参咙。


謝謝觀賞
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市硫眯,隨后出現(xiàn)的幾起案子蕴侧,更是在濱河造成了極大的恐慌,老刑警劉巖两入,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净宵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谆刨,警方通過(guò)查閱死者的電腦和手機(jī)塘娶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痊夭,“玉大人刁岸,你說(shuō)我怎么就攤上這事∷遥” “怎么了虹曙?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)番舆。 經(jīng)常有香客問我酝碳,道長(zhǎng),這世上最難降的妖魔是什么恨狈? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任疏哗,我火速辦了婚禮,結(jié)果婚禮上禾怠,老公的妹妹穿的比我還像新娘返奉。我一直安慰自己,他們只是感情好吗氏,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布芽偏。 她就那樣靜靜地躺著,像睡著了一般弦讽。 火紅的嫁衣襯著肌膚如雪污尉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天往产,我揣著相機(jī)與錄音被碗,去河邊找鬼。 笑死仿村,一個(gè)胖子當(dāng)著我的面吹牛蛮放,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奠宜,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼包颁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了压真?” 一聲冷哼從身側(cè)響起娩嚼,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滴肿,沒想到半個(gè)月后岳悟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泼差,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年贵少,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堆缘。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滔灶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吼肥,到底是詐尸還是另有隱情录平,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布缀皱,位于F島的核電站斗这,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏啤斗。R本人自食惡果不足惜表箭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钮莲。 院中可真熱鬧免钻,春花似錦、人聲如沸臂痕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)握童。三九已至姆怪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澡绩,已是汗流浹背稽揭。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肥卡,地道東北人溪掀。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像步鉴,于是被迫代替她去往敵國(guó)和親揪胃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子璃哟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,305評(píng)論 25 707
  • 通常在ViewPager的上方,我們都會(huì)放一個(gè)標(biāo)簽指示器與ViewPager進(jìn)行聯(lián)動(dòng)喊递。以前随闪,我們大多使用的是Git...
    DoAndKeep閱讀 79,608評(píng)論 36 110
  • 剛腦海中突然浮現(xiàn)出小時(shí)候家旁邊雨后的田埂上一群鴨子在覓食的情景,那是二十年前的事骚勘,覺得怎么那么遙遠(yuǎn)铐伴,好像上輩子的事...
    木木日記2020閱讀 130評(píng)論 0 0
  • 在這個(gè)極速發(fā)展的時(shí)代泽疆,有數(shù)據(jù)分析:現(xiàn)代人每天不停刷手機(jī)的時(shí)間約12小時(shí)户矢。可是于微,你有沒有覺得看了那么多東西卻什么也記...
    tatablue閱讀 638評(píng)論 0 1
  • 哈哈逗嫡,沉寂了好久都沒有發(fā)文章,就發(fā)發(fā)繪畫的教程吧株依。說(shuō)起來(lái)也很久沒有share畫作了驱证,那就拿出最近畫的貓咪來(lái)弄個(gè)教程...
    KellyGor閱讀 1,961評(píng)論 9 24