Android Design Support Library系列之一:TabLayout的使用

原文章地址

Google官方在14年 I/O大會上推出了全新的設計語言——Material Design,

Material Design讓Android界面在體驗上更加鮮艷和簡潔,正在逐步成為APP設計的趨勢.

而與Material Design相關的是一系列實現Material Design效果的控件庫Android Design Support Library,從今天開始將一一介紹他們的用法.

這一系列控件庫在使用時都需要在gradle中添加依賴:

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

一、TabLayout介紹

官方地址:TabLayout

需要翻墻

TabLayout1

TabLayout2

像上面這種選項卡切換的效果,幾乎所有應用中都有涉及到,這種效果實現方式很多,TabHost實現、RadioGroup+RadioButton實現、ViewPager+PagerTabStrip或者種種第三方庫(Viewpageindicator…)來實現、HorizontalScrollView+LinearLayout動態實現……

而在Android Design Support Library中就有這樣一個控件:TabLayout,繼承自HorizontalScrollView,通過TabLayout我們可以很輕松的實現這種效果.

二、TabLayout簡單使用

布局文件:


? ? xmlns:tools="http://schemas.android.com/tools"

? ? android:layout_width="match_parent"

? ? android:layout_height="match_parent"

? ? android:orientation="vertical">


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

? ? ? ? android:layout_width="match_parent"

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


Activity中:

package com.my;

import android.support.design.widget.TabLayout;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

? ? private TabLayout mTablayout;

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);

? ? ? ? mTablayout = (TabLayout) findViewById(R.id.tablayout);

? ? ? ? mTablayout.addTab(mTablayout.newTab().setText("A"));

? ? ? ? mTablayout.addTab(mTablayout.newTab().setText("B"));

? ? ? ? mTablayout.addTab(mTablayout.newTab().setText("C"));

? ? }

}

效果圖:

簡單的選項卡效果就實現了,當然,你也可以在布局文件中寫死,像下面這樣:


? ? xmlns:tools="http://schemas.android.com/tools"

? ? android:layout_width="match_parent"

? ? android:layout_height="match_parent"

? ? android:orientation="vertical">


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

? ? ? ? android:layout_width="match_parent"

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


? ? ? ? ? ? android:layout_width="wrap_content"

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

? ? ? ? ? ? android:text="A" />


? ? ? ? ? ? android:layout_width="wrap_content"

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

? ? ? ? ? ? android:text="B" />


? ? ? ? ? ? android:layout_width="wrap_content"

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

? ? ? ? ? ? android:text="C" />


效果和上面是一樣的,不過一般沒人這么使用.

三、TabLayout的常用屬性

app:tabIndicatorColor=""? 指示器顏色

app:tabIndicatorHeight=""? 指示器高度,設置為0就是沒有指示器

app:tabTextColor=""? ? Tab文本默認顏色

app:tabSelectedTextColor=""? ? Tab文本被選中后的顏色

app:tabTextAppearance=""? ? ? 為Tab文本設置樣式,一般是需要為Tab加圖標時使用

app:tabMode=""? 只有兩個值:fixed、scrollable

? ? fixed用于標題欄少的情況,每個Tab可以平分屏幕寬度

? ? scrollable用于標題欄多出屏幕的情況,如果標題欄少的時候用很難看,占不滿屏幕

app:tabBackground=""? ? TabLayout背景,和android:background=""效果一樣

app:tabGravity=""? ? 對齊方式:? 居中顯示center、fill填滿

app:tabGravity=”center”

app:tabGravity=”fill”

還有一些很少使用的:

從左邊開始偏移距離,tabMode值必須為scrollable才會生效

app:tabContentStart="150dp"

app:tabContentStart

選項卡寬度限制

app:tabMaxWidth=""? 最大寬度

app:tabMinWidth=""? 最小寬度

Tab內邊距

app:tabPaddingStart=""

app:tabPaddingBottom=""

app:tabPaddingEnd=""

app:tabPaddingTop=""

app:tabPadding=""

三、TabLayout方法

Tablayout.newTab()? ? ? ? 創建標簽

Tablayout.addTab()? ? ? ? 添加標簽

Tablayout.removeTab()? ? ? 刪除標簽

Tablayout.removeTabAt()? ? 通過索引刪除標簽

Tablayout.removeAllTabs()? 刪除全部標簽

因為TabLayout繼承自HorizontalScrollView,所以可以直接添加View

addView ()

添加監聽器,取消監聽器,清楚所有的監聽器

Tablayout.addOnTabSelectedListener()

Tablayout.removeOnTabSelectedListener()

Tablayout.clearOnTabSelectedListeners()

Tablayout.getSelectedTabPosition()? ? 獲取當前選中的Tab位置

Tablayout.getTabAt()? ? ? 根據索引獲取Tab

Tablayout.getTabCount()? ? 獲取Tab總數

對應tabGravity屬性

Tablayout.getTabGravity()

Tablayout.setTabGravity()

對應tabMode屬性

Tablayout.getTabMode()

Tablayout.setTabMode()

對應tabTextColor屬性

Tablayout.setTabTextColors()

Tablayout.getTabTextColors()

和ViewPager關聯,隨著ViewPager滑動而滑動

TabLayout和ViewPager配合使用是最常見的運用方式

兩者關聯后:

1)TabLayout之前創建的Tab并不能正常顯示,但可以在關聯后通過 getTabAt() 得到標簽之后進行修改

但其實沒有必要,我們一般由2)和3)決定Tab的數量和內容

2)TabLayout的Tab數量由ViewPager分頁數量決定

3)TabLayout的Tab內容由ViewPager的Adapter中 getPagerTitle() 方法返回的內容決定

Tablayout.setupWithViewPager()

TabLayout中的內部類:Tab,表示TabLayout中的每一個標簽

Tab的方法

boolean is Selected()? Tab是否被選中

void setSelected()? 設置Tab為被選中狀態

setText ()? ? 設置Tab文本內容

getText ()? ? 獲取Tab文本內容

getIcon ()? 獲取Tab的圖標

setIcon ()? 為Tab添加圖標

setCustomView()? ? 設置用戶自定義的Tab,參數為資源id或者View對象

getPosition() 獲取當前位置

四、TabLayout搭配ViewPager使用

1、MainActivity布局文件的兩種方式


? ? xmlns:app="http://schemas.android.com/apk/res-auto"

? ? android:layout_width="match_parent"

? ? android:layout_height="match_parent"

? ? android:orientation="vertical">


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

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="match_parent">


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

? ? ? ? ? ? app:tabMode="scrollable"

? ? ? ? ? ? app:tabBackground="@android:color/holo_blue_dark"

? ? ? ? ? ? app:tabIndicatorColor="@android:color/white"

? ? ? ? ? ? app:tabTextColor="@android:color/black"

? ? ? ? ? ? app:tabSelectedTextColor="@android:color/white"

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

? ? ? ? ? ? android:layout_height="wrap_content"/>



? ? xmlns:app="http://schemas.android.com/apk/res-auto"

? ? android:layout_width="match_parent"

? ? android:layout_height="match_parent"

? ? android:orientation="vertical">


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

? ? ? ? app:tabMode="scrollable"

? ? ? ? app:tabBackground="@android:color/holo_blue_dark"

? ? ? ? app:tabIndicatorColor="@android:color/white"

? ? ? ? app:tabTextColor="@android:color/black"

? ? ? ? app:tabSelectedTextColor="@android:color/white"

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="wrap_content"/>


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

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="match_parent">


2、MainActivity.java

package com.my;

import android.os.Bundle;

import android.support.design.widget.TabLayout;

import android.support.v4.app.Fragment;

import android.support.v4.view.ViewPager;

import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;

import java.util.List;

public class MainActivity extends AppCompatActivity {

? ? private TabLayout mTablayout;

? ? private ViewPager mViewPager;

? ? private List mDatas;

? ? private List fragments;

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);

? ? ? ? initData();

? ? ? ? initFragments();

? ? ? ? mTablayout = (TabLayout) findViewById(R.id.tablayout);

? ? ? ? mViewPager = (ViewPager) findViewById(R.id.viewpager);

? ? ? mViewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(), mDatas, fragments));

//? ? ? ? mTablayout.setupWithViewPager(mViewPager);

//注意:我的布局文件中ViewPager和TabLayout 是嵌套的,所以不需要這一步

//? ? ? ? ? 如果沒有嵌套,則需要在ViewPager設置Adapter之后加上這一步

//另外,只能是ViewPager嵌套Tablayout,反了會報錯的,因為Tablayout中只能嵌套TabItem

? ? }

? ? private void initData() {

? ? ? ? mDatas = new ArrayList<>();

? ? ? ? for (int i = 'A'; i < 'I'; i++) {

? ? ? ? ? ? mDatas.add("" + (char) i);

? ? ? ? }

? ? }

? ? private void initFragments() {

? ? ? ? fragments = new ArrayList<>();

? ? ? ? for (int i = 0; i < mDatas.size(); i++) {

? ? ? ? ? ? MyFragment fragment = MyFragment.newInstance(mDatas.get(i));

? ? ? ? ? ? fragments.add(fragment);

? ? ? ? }

? ? }

}

3、MyPagerAdapter.java

package com.my;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentStatePagerAdapter;

import java.util.List;

/**

* Created by fgq on 2017/5/9.

*/

public class MyPagerAdapter extends FragmentStatePagerAdapter {

? ? private List mDatas;

? ? private List mFragments;

? ? public MyPagerAdapter(FragmentManager fm, List mDatas, List fragments) {

? ? ? ? super(fm);

? ? ? ? this.mDatas = mDatas;

? ? ? ? this.mFragments = fragments;

? ? }

? ? @Override

? ? public Fragment getItem(int position) {

? ? ? ? return mFragments.get(position);

? ? }

? ? @Override

? ? public int getCount() {

? ? ? ? return mDatas.size()==mFragments.size()?mFragments.size():0;

? ? }

? ? /**

? ? * 重寫此方法,返回TabLayout的內容

? ? */

? ? @Override

? ? public CharSequence getPageTitle(int position) {

? ? ? ? return mDatas.get(position);

? ? }

}

4、MyFragment.java

package com.my;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

/**

* Created by fgq on 2017/5/9.

*/

public class MyFragment extends Fragment {

? ? public static MyFragment newInstance(String data) {

? ? ? ? Bundle args = new Bundle();

? ? ? ? args.putString("key", data);

? ? ? ? MyFragment fragment = new MyFragment();

? ? ? ? fragment.setArguments(args);

? ? ? ? return fragment;

? ? }

? ? @Override

? ? public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

? ? ? ? View view = inflater.inflate(R.layout.fragment, container, false);

? ? ? ? TextView tv = (TextView) view.findViewById(R.id.tv);

? ? ? ? tv.setText("Fragment------" + getArguments().getString("key"));

? ? ? ? return view;

? ? }

}

5、Fragment布局文件


? ? xmlns:tools="http://schemas.android.com/tools"

? ? android:layout_width="match_parent"

? ? android:layout_height="match_parent">


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

? ? ? ? android:layout_width="wrap_content"

? ? ? ? android:layout_height="wrap_content"

? ? ? ? android:layout_centerInParent="true"

? ? ? ? tools:text="別看了,我就是一個TextView" />

5、效果圖

五、TabLayout之自定義Tab布局

我們的Tab上有時候不僅僅只有文字,還會有圖標,那么這時候我們的getPageTitle()方法就不應該僅僅返回一個文本了.

方式1:通過SpannableString為Tab添加圖標

SpannableString基本上與String差不多,也是用來存儲字符串,但它們倆的特殊就在于SpannableString有一個SetSpan()方法,能給這些存儲的String添加各種格式或者稱樣式(Span),將原來的String以不同的樣式顯示出來,比如在原來String上加下劃線、加背景色、改變字體顏色、用圖片把指定的文字給替換掉,等等.

MainActivity中的修改

private int[] imageRes = {

? ? ? ? ? ? R.mipmap.a,R.mipmap.b, R.mipmap.c,R.mipmap.d,

? ? ? ? ? ? R.mipmap.e, R.mipmap.f,R.mipmap.g,R.mipmap.h

};

mViewPager.setAdapter(new MyPagerAdapter(MainActivity.this,getSupportFragmentManager(), mDatas, fragments,imageRes));

添加了一個裝有圖片資源的數組,然后通過構造傳給MyPagerAdapter,當然,其實標題mDatas和圖標資源imageRes你直接聲明在MyPagerAdapter中也是可以的.

MyPagerAdapter中的修改

? ? private int[] imageRes;

? ? private Context mContext;

? ? public MyPagerAdapter(Context context, FragmentManager fm, List mDatas, List fragments, int[] imageRes) {

? ? ? ? super(fm);

? ? ? ? this.mContext = context;

? ? ? ? this.mDatas = mDatas;

? ? ? ? this.mFragments = fragments;

? ? ? ? this.imageRes = imageRes;

? ? }

? ? /**

? ? * 通過SpannableString 為Tab添加各種樣式,這里就添加了一個圖標

? ? */

? ? @Override

? ? public CharSequence getPageTitle(int position) {

? ? ? ? SpannableString sb = new SpannableString("? "+mDatas.get(position));

? ? ? ? Drawable image = mContext.getResources().getDrawable(imageRes[position]);

? ? ? image.setBounds(0,0,image.getIntrinsicWidth(), image.getIntrinsicHeight());

? ? ? ? ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM);

? ? ? ? sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

? ? ? ? return sb;

? ? }

運行之后你會發現效果沒變,這是因為TabLayout創建的tab默認樣式textAllCaps屬性為true,這阻止了ImageSpan被渲染出來,可以通過下面的樣式文件定義來改變:

在res/values/styles中定義我們自己的樣式,把textAllCaps屬性設為false

? ?

? ? ? ? false



TabLayout中Tab的文字大小無法在布局文件中更改,也是在這里更改的

在布局文件中為TabLayout引用我們自己的樣式

? app:tabTextAppearance="@style/MyTabTextAppearance"

效果圖

方式2:通過Tab的setCustomView()方法自定義Tab布局

上面已經介紹了,Tab有一個方法,setCustomView(),參數為一個資源id或者一個View對象,我們通過這個方法來自定義Tab的布局.

1)MainActivity布局文件


? ? xmlns:app="http://schemas.android.com/apk/res-auto"

? ? android:layout_width="match_parent"

? ? android:layout_height="match_parent"

? ? android:orientation="vertical">


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

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="wrap_content"

? ? ? ? app:tabBackground="@android:color/holo_blue_dark"

? ? ? ? app:tabIndicatorColor="@android:color/white"

? ? ? ? app:tabMode="scrollable"

? ? ? ? app:tabSelectedTextColor="@android:color/white"

? ? ? ? app:tabTextAppearance="@style/MyTabTextAppearance"

? ? ? ? app:tabTextColor="@android:color/black" />


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

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="match_parent">


2)MainActivity.java

package com.my;

import android.os.Bundle;

import android.support.design.widget.TabLayout;

import android.support.v4.app.Fragment;

import android.support.v4.view.ViewPager;

import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;

import java.util.List;

public class MainActivity extends AppCompatActivity {

? ? private TabLayout mTablayout;

? ? private ViewPager mViewPager;

? ? private List mDatas;

? ? private List fragments;

? ? private MyPagerAdapter mAdapter;

? ? private int[] imageRes = {

? ? ? ? ? ? R.mipmap.a,R.mipmap.b, R.mipmap.c,R.mipmap.d,

? ? ? ? ? ? R.mipmap.e, R.mipmap.f,R.mipmap.g,R.mipmap.h

? ? };

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);

? ? ? ? initData();

? ? ? ? initFragments();

? ? ? ? mTablayout = (TabLayout) findViewById(R.id.tablayout);

? ? ? ? mViewPager = (ViewPager) findViewById(R.id.viewpager);

? ? ? ? mAdapter = new MyPagerAdapter(MainActivity.this,getSupportFragmentManager(), mDatas, fragments,imageRes);

? ? ? ? mViewPager.setAdapter(mAdapter);

? ? ? ? mTablayout.setupWithViewPager(mViewPager);

? ? ? ? /**

? ? ? ? * 為每一個Tab設置自定義布局

? ? ? ? */

? ? ? ? for (int i = 0; i

? ? ? ? ? ? TabLayout.Tab tab = mTablayout.getTabAt(i);

? ? ? ? ? ? tab.setCustomView(mAdapter.getTabView(i));

? ? ? ? }

? ? }

? ? private void initData() {

? ? ? ? mDatas = new ArrayList<>();

? ? ? ? for (int i = 'A'; i < 'I'; i++) {

? ? ? ? ? ? mDatas.add("" + (char) i);

? ? ? ? }

? ? }

? ? private void initFragments() {

? ? ? ? fragments = new ArrayList<>();

? ? ? ? for (int i = 0; i < mDatas.size(); i++) {

? ? ? ? ? ? MyFragment fragment = MyFragment.newInstance(mDatas.get(i));

? ? ? ? ? ? fragments.add(fragment);

? ? ? ? }

? ? }

}

3)MyPagerAdapter.java

package com.my;

import android.content.Context;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentStatePagerAdapter;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.ImageView;

import android.widget.TextView;

import java.util.List;

/**

* Created by fgq on 2017/5/9.

*/

public class MyPagerAdapter extends FragmentStatePagerAdapter {

? ? private List mDatas;

? ? private List mFragments;

? ? private int[] imageRes;

? ? private Context mContext;

? ? public MyPagerAdapter(Context context, FragmentManager fm, List mDatas, List fragments, int[] imageRes) {

? ? ? ? super(fm);

? ? ? ? this.mContext = context;

? ? ? ? this.mDatas = mDatas;

? ? ? ? this.mFragments = fragments;

? ? ? ? this.imageRes = imageRes;

? ? }

? ? @Override

? ? public Fragment getItem(int position) {

? ? ? ? return mFragments.get(position);

? ? }

? ? @Override

? ? public int getCount() {

? ? ? ? return mDatas.size()==mFragments.size()?mFragments.size():0;

? ? }

? ? /**

? ? * 要使用我們自定義的布局,這里返回null

? ? */

? ? @Override

? ? public CharSequence getPageTitle(int position) {

? ? ? ? return null;

? ? }

? ? /**

? ? * 定義一個方法,來返回Tab的內容

? ? */

? ? public View getTabView(int position){

? ? ? View view = LayoutInflater.from(mContext).inflate(R.layout.tab_layout, null);

? ? ? ? TextView tv= (TextView) view.findViewById(R.id.tv);

? ? ? ? ImageView iv = (ImageView) view.findViewById(R.id.iv);

? ? ? ? tv.setText(mDatas.get(position));

? ? ? ? iv.setImageResource(imageRes[position]);

? ? ? ? return view;

? ? }

}

4)每一個Tab的布局文件


? ? xmlns:tools="http://schemas.android.com/tools"

? ? android:layout_width="match_parent"

? ? android:layout_height="wrap_content"

? ? android:orientation="vertical">


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

? ? ? ? android:layout_width="wrap_content"

? ? ? ? android:layout_height="wrap_content"

? ? ? ? android:layout_gravity="center"

? ? ? ? tools:src="@mipmap/a" />


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

? ? ? ? android:layout_width="wrap_content"

? ? ? ? android:layout_height="wrap_content"

? ? ? ? android:layout_gravity="center"

? ? ? ? android:layout_marginTop="5dp"

? ? ? ? tools:text="別看了,我就是一個TextView" />

其它的文件沒有發生改變

5)效果圖

ok, 效果還好,但是文字顏色的選擇器效果沒了,這種情況我們可以在每一個Tab的布局文件為TextView的textColor設置一個選擇器就行了

android:textColor="@drawable/seletor_tab_textcolor"

在drawable目錄下新建一個選擇器seletor_tab_textcolor.xml


? ?

? ?

但是圖片要實現選擇器的效果就不好辦了,Tab數量太多,針對每一個tab的圖片都需要一個seletor….

另外我們也注意到:setCustomView()為Tab設置自定義布局的參數不僅僅可以是View對象,也可以是資源Id.像下面這樣:

? ? ? ? int[] tabs = {R.layout.tab_one,

? ? ? ? ? ? ? ? ? ? R.layout.tab_two,

? ? ? ? ? ? ? ? ? ? R.layout.tab_three,

? ? ? ? ? ? ? ? ? ? R.layout.tab_four};//有多少tab,就添加多少tab的布局文件

? ? ? ? for (int i = 0; i < mTablayout.getTabCount(); i++) {

? ? ? ? ? ? mTabLayout.getTabAt(i).setCustomView(tabs[i]);

? ? ? ? }

這種做法適合選項卡比較少而且固定的情況.

六、關于TabLayout指示器長度的更改

TabLayout的指示器(Indicator)可以更改顏色、高度,但是你會發現沒有更改長度的屬性或者方法,這時我們查看源碼,發現被private 了,所以只能通過反射來做了.

private final SlidingTabStrip mTabStrip;

? ? public? void setIndicator(TabLayout tabs, int leftDip, int rightDip) {

? ? ? ? Class tabLayout = tabs.getClass();

? ? ? ? Field tabStrip = null;

? ? ? ? try {

? ? ? ? ? ? tabStrip = tabLayout.getDeclaredField("mTabStrip");

? ? ? ? } catch (NoSuchFieldException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? tabStrip.setAccessible(true);

? ? ? ? LinearLayout ll_tab = null;

? ? ? ? try {

? ? ? ? ? ? ll_tab = (LinearLayout) tabStrip.get(tabs);

? ? ? ? } catch (IllegalAccessException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? int left = (int) (Resources.getSystem().getDisplayMetrics().density * leftDip);

? ? ? ? int right = (int) (Resources.getSystem().getDisplayMetrics().density * rightDip);

? ? ? ? for (int i = 0; i < ll_tab.getChildCount(); i++) {

? ? ? ? ? ? View child = ll_tab.getChildAt(i);

? ? ? ? ? ? child.setPadding(0, 0, 0, 0);

? ? ? ? ? ? LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);

? ? ? ? ? ? params.leftMargin = left;

? ? ? ? ? ? params.rightMargin = right;

? ? ? ? ? ? child.setLayoutParams(params);

? ? ? ? ? ? child.invalidate();

? ? ? ? }

? ? }

注意:tabMode必須是fixed

1)調用setIndicator(mTabLayout, 20, 20);方法即可,這兩個20根據實際需求來定.

2)關于背景不正常問題,不要使用TabLayout自帶的app:tabBackground=””;

使用android:background=” “就可以了

ok,TabLayout的使用就寫到這里,如果你的項目中有類似效果要實現,不妨試試TabLayout.

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容