android TabLayout自定義指示器樣式和長度玛瘸,通過自定義setCustomView()方式的封裝

1.描述

viewpager+tabLayout+fragment非常常見蜕青,但google只給出了改變tabLayout中的tab IndicatorHeight的方法,其寬度是填充滿整個tab的捧韵,且不能更改市咆。在網(wǎng)上看了很多關(guān)于改變indicator的長度的方式,大多集中與反射和setCustomView()的方式再来,個人更傾向于后者蒙兰。

2.實現(xiàn)

1.效果

Screenshot_2019-07-23-13-35-38-385_com.summer.tab.png

2.setCustomView的使用方式

或許大概可能都知道吧,還是記錄一下

for(int i=0;i<tabLayout.getTabCount();i++){
      Tab tab =tabLayout.getTabAt(i);
      View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_extentd_tab, (LinearLayout) tabView, false);
      tab.setCustomView(view);
}

網(wǎng)上通常的做法是通過以上循環(huán)來添加芒篷,其中l(wèi)ayout_extend_tab是自定義customView的布局搜变,在此處有一點小坑(我被坑了反正),此處的LayoutInflater.from(getContext()).inflate(R.layout.layout_extentd_tab, (LinearLayout) tabView, false)必須這樣用针炉,我通常加載布局是使用LayoutInflater.from(getContext()).inflate(R.layout.layout_extentd_tab, null),如果這樣加載的話大家可能會發(fā)現(xiàn)無論如何設置的customView根本不能填充滿tabView挠他。如果每個需要用到tabLayout+viewpager+fragment的地方都這樣使用,有點繁瑣篡帕。

3.封裝

在tabLayout中addTab()有四個重載方法殖侵,但無論顯示調(diào)用哪一個,最終都會調(diào)用到public void addTab(@NonNull Tab tab, int position, boolean setSelected)估重寫此方法來加載coustomView镰烧,具體代碼如下:

@Override
public void addTab(@NonNull Tab tab, int position, boolean setSelected) {
    tab.setCustomView(createTabCustomView(tab.getText(), tab.view));
    super.addTab(tab, position, setSelected);
}

/**
 * 設置tab
 */
private View createTabCustomView(CharSequence text, View tabView) {
    View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_extentd_tab, (LinearLayout) tabView, false);
    TextView textView = view.findViewById(R.id.layout_extend_tab_tv_content);
    textView.setText(text);
    textView.setTextColor(getTabTextColors());
    View indicator = view.findViewById(R.id.layout_extend_tab_indicator);
    ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) indicator.getLayoutParams();
    params.height = indicatorHeight;
    params.leftMargin = indicatorMarginStart;
    params.rightMargin = indicatorMarginEnd;
    indicator.setLayoutParams(params);
    indicator.setBackgroundColor(indicatorSelectColor);
    indicator.setBackground(createStateListDrawable());
    return view;
}
/**
 * 創(chuàng)建StateListDrawable
 *
 * @return
 */
private StateListDrawable createStateListDrawable() {
    StateListDrawable stateListDrawable = new StateListDrawable();
    stateListDrawable.addState(new int[]{android.R.attr.state_selected}, new ColorDrawable(indicatorSelectColor));
    stateListDrawable.addState(new int[]{}, new ColorDrawable());
    return stateListDrawable;
}

最后附上layout_extentd_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/layout_extend_tab_tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            app:layout_constraintBottom_toTopOf="@+id/layout_extend_tab_indicator"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <View
            android:id="@+id/layout_extend_tab_indicator"
            android:layout_width="0dp"
            android:layout_height="3dp"
            android:layout_gravity="bottom"
            android:background="@color/themeColor"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="@+id/layout_extend_tab_tv_content"
            app:layout_constraintStart_toStartOf="@+id/layout_extend_tab_tv_content" />
    </androidx.constraintlayout.widget.ConstraintLayout>

</LinearLayout>

完整代碼查看https://github.com/lijheng/tabLayout

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拢军,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怔鳖,更是在濱河造成了極大的恐慌茉唉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異度陆,居然都是意外死亡艾凯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門懂傀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趾诗,“玉大人,你說我怎么就攤上這事鸿竖〔拙梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵缚忧,是天一觀的道長悟泵。 經(jīng)常有香客問我,道長闪水,這世上最難降的妖魔是什么糕非? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮球榆,結(jié)果婚禮上朽肥,老公的妹妹穿的比我還像新娘。我一直安慰自己持钉,他們只是感情好衡招,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著每强,像睡著了一般始腾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上空执,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天浪箭,我揣著相機與錄音,去河邊找鬼辨绊。 笑死奶栖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的门坷。 我是一名探鬼主播宣鄙,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼默蚌!你這毒婦竟也來了框冀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤敏簿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惯裕,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡温数,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜻势。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撑刺。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖握玛,靈堂內(nèi)的尸體忽然破棺而出够傍,到底是詐尸還是另有隱情,我是刑警寧澤挠铲,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布冕屯,位于F島的核電站,受9級特大地震影響拂苹,放射性物質(zhì)發(fā)生泄漏安聘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一瓢棒、第九天 我趴在偏房一處隱蔽的房頂上張望浴韭。 院中可真熱鬧,春花似錦脯宿、人聲如沸念颈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榴芳。三九已至,卻和暖如春窘面,著一層夾襖步出監(jiān)牢的瞬間翠语,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工财边, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肌括,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓酣难,卻偏偏與公主長得像谍夭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子憨募,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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