Android TabLayout設(shè)置指示器寬度的方法
anroid 5.0 Design v7 包中引用了TabLayout 簡單快速的寫出屬于自己的Tab切換效果 如圖所示:

但是正常使用中你發(fā)現(xiàn)無法設(shè)置tablayout指示器的寬度。查看源碼你會(huì)發(fā)現(xiàn)設(shè)計(jì)師將指示器的寬度設(shè)置成TabView最大的寬度。并且設(shè)計(jì)師并沒有給我們暴漏出接口,這導(dǎo)致有時(shí)使用TabLayout無法滿足一些產(chǎn)品設(shè)計(jì)要求,這么好的組件無法使用還需要自定義費(fèi)時(shí)費(fèi)力。這個(gè)時(shí)候我們可以通過反射機(jī)制拿到TabLayout中的指示器對(duì)象對(duì)它的寬度進(jìn)行處理就可以滿足我們的要求:具體代碼如下
重寫 onMeasure方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int dp10 = CommUitls.dip2px(context, 10);
LinearLayout mTabStrip = (LinearLayout) this.getChildAt(0);
try {
Field mTabs = TabLayout.class.getDeclaredField("mTabs");
mTabs.setAccessible(true);
ArrayList<Tab> tabs = (ArrayList<Tab>) mTabs.get(this);
for (int i = 0; i < mTabStrip.getChildCount(); i++) {
Tab tab = tabs.get(i);
Field mView = tab.getClass().getDeclaredField("mView");
mView.setAccessible(true);
Object tabView = mView.get(tab);
Field mTextView = context.getClassLoader().loadClass("android.support.design.widget.TabLayout$TabView").getDeclaredField("mTextView");
mTextView.setAccessible(true);
TextView textView = (TextView) mTextView.get(tabView);
float textWidth = textView.getPaint().measureText(textView.getText().toString());
View child = mTabStrip.getChildAt(i);
child.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) textWidth, LinearLayout.LayoutParams.MATCH_PARENT);
params.leftMargin = dp10;
params.rightMargin = dp10;
child.setLayoutParams(params);
child.invalidate();
}
} catch (Exception e) {
e.printStackTrace();
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android?拍照功能實(shí)現(xiàn)(手機(jī)關(guān)閉依然拍照)詳解及實(shí)例代碼
這篇文章主要介紹了?Android?拍照功能實(shí)現(xiàn)(手機(jī)關(guān)閉依然拍照)詳解及實(shí)例代碼的相關(guān)資料,這對(duì)Android相機(jī)在不開手機(jī)的情況下還能繼續(xù)拍照,附有實(shí)例Demo,需要的朋友可以參考下2016-12-12
Android使用Intent實(shí)現(xiàn)頁面跳轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Android使用Intent實(shí)現(xiàn)頁面跳轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
RecyclerView+CardView實(shí)現(xiàn)橫向卡片式滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了RecyclerView+CardView實(shí)現(xiàn)橫向卡片式滑動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android基于ListView實(shí)現(xiàn)類似Market分頁加載效果示例
這篇文章主要介紹了Android基于ListView實(shí)現(xiàn)類似Market分頁加載效果,結(jié)合完整實(shí)例形式分析了ListView的OnScroll方法來實(shí)現(xiàn)分頁與滾動(dòng)加載的操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-10-10
關(guān)于Android Studio安裝完后activity_main.xml前幾行報(bào)錯(cuò)的解決建議
這篇文章主要介紹了關(guān)于Android Studio安裝完后activity_main.xml前幾行報(bào)錯(cuò)的解決建議,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android 進(jìn)度條自動(dòng)前進(jìn)效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 進(jìn)度條自動(dòng)前進(jìn)效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Android中實(shí)現(xiàn)多線程操作的幾種方式
多線程一直是一個(gè)老大難的問題,首先因?yàn)樗y以理解,其次在實(shí)際工作中我們需要面對(duì)的關(guān)于線程安全問題也并不常見,今天就來總結(jié)一下實(shí)現(xiàn)多線程的幾種方式,感興趣的可以了解一下2021-06-06
詳解Android開發(fā)數(shù)據(jù)持久化之文件存儲(chǔ)(附源碼)
本篇文章主要介紹了詳解Android開發(fā)數(shù)據(jù)持久化之文件存儲(chǔ)(附源碼),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android自定義View實(shí)現(xiàn)字母導(dǎo)航欄
通常手機(jī)通訊錄都會(huì)有索引欄,這篇文章主要介紹了Android自定義View實(shí)現(xiàn)字母導(dǎo)航欄,現(xiàn)在分享給大家。2016-10-10
Android View事件分發(fā)和消費(fèi)源碼簡單理解
這篇文章主要介紹了Android View事件分發(fā)和消費(fèi)源碼簡單理解的相關(guān)資料,需要的朋友可以參考下2017-07-07

