TabLayout 的用法

TabLayout是属于容器控件, 提供水平显示Tab的效果. 常常和ViewPager配合使用. 我将全面地讲解其用法. 反正我是没看过比我还详细的了.

演示

添加依赖

这是Android Design 包下的类, 该包是Android5.0 引入的UI包

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

布局

代码

publicclassMainActivityextendsAppCompatActivity{@BindView(R.id.tab_layout)    TabLayout mTabLayout;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        mTabLayout.addTab(mTabLayout.newTab().setText("首页"));        mTabLayout.addTab(mTabLayout.newTab().setText("分类"));        mTabLayout.addTab(mTabLayout.newTab().setText("设置"));    }}

第二种方式

完全通过布局创建


TabLayout

方法有点多

属性

修改布局的属性

显示模式

可滑动

app:tabMode="scrollable"

固定

app:tabMode="fixed"

指示器选项

app:tabIndicatorHeight="10dp"//指示器高度app:tabIndicatorColor="@color/colorPrimary"// 指示器颜色

文字选项

app:tabSelectedTextColor="#ffffff"// 选择的Tab的文字颜色app:tabTextColor="#000000"// 未选择的Tab文字颜色app:tabTextAppearance="@style/Base.TextAppearance.AppCompat.Large"// 文字样式

背景设置

两者没什么区别

android:background="@color/colorAccent"// 背景app:tabBackground="@color/colorPrimary"//背景

标签距离

app:tabPaddingStart="10dp"app:tabPaddingBottom="10dp"app:tabPadding="10dp"app:tabPaddingEnd="10dp"app:tabPaddingTop="10dp"

对齐方式

居中显示

app:tabGravity="center"

填充

app:tabGravity="fill"


偏移

从左边开始偏移距离, 必须是可滑动的模式 scrollable

app:tabContentStart="200dp"

标签宽度限制

最大宽度

app:tabMaxWidth="50dp"

最小宽度

app:tabMinWidth="100dp"

代码

TabLayout提供的方法

标签

创建标签

TabLayout.TabnewTab()

添加标签, 只有添加后才能显示

voidaddTab(TabLayout.Tab tab)voidaddTab(TabLayout.Tab tab,intposition)voidaddTab(TabLayout.Tab tab,booleansetSelected)voidaddTab(TabLayout.Tab tab,intposition,booleansetSelected)

删除标签

voidremoveTab(TabLayout.Tab tab)

通过索引删除标签

voidremoveTabAt(intposition)

删除全部标签

voidremoveAllTabs()

得到标签

TabLayout.TabgetTabAt(intindex)

得到标签总数

intgetTabCount()

设置样式

指示器

voidsetSelectedTabIndicatorColor(intcolor)// 指示器颜色voidsetSelectedTabIndicatorHeight(intheight)// 指示器高度

标签文本

voidsetTabTextColors(intnormalColor,// 正常颜色intselectedColor)// 选择状态颜色voidsetTabTextColors(ColorStateList textColor)// 状态颜色

显示模式

这个之前属性里面介绍过了

intgetTabMode()voidsetTabMode(intmode)

mode:

MODE_SCROLLABLE

MODE_FIXED

对齐方式

voidsetTabGravity(intgravity)intgetTabGravity()

添加View

不止是添加标签Tab还可以直接添加View

voidaddView(View child)voidaddView(View child,intindex)voidaddView(View child,

ViewGroup.LayoutParams params)voidaddView(View child, // View对象intindex, // 位置索引                ViewGroup.LayoutParams params)// 布局参数

得到当前选择的位置

intgetSelectedTabPosition()

监听器

选择监听器

该方法已经被废弃, 不推荐使用.

voidsetOnTabSelectedListener(TabLayout.OnTabSelectedListener listener)

替代的方法是

voidaddOnTabSelectedListener(TabLayout.OnTabSelectedListener listener)

该监听器用完后需要删除

voidremoveOnTabSelectedListener(TabLayout.OnTabSelectedListener listener)

一次性删除所有添加的选择监听器

voidclearOnTabSelectedListeners()

Tab

该类是TabLayout的内部类, 表示TabLayout中的每一个标签. 我将介绍这个类的所有方法

判断是否被选择

booleanisSelected()

设置为被选择状态

voidselect()

描述内容

如果你没用设置描述内容, 默认的是标签的标题

TabLayout.TabsetContentDescription(intresId)// 用strings id的TabLayout.TabsetContentDescription(CharSequence contentDesc)CharSequencegetContentDescription()

自定义标签的内容

每个标签可以尽情的自定义视图

TabLayout.TabsetCustomView(intresId)TabLayout.TabsetCustomView(View view)

标签的标签

给Tab设置tag, 然后就可以通过tag得到Tab

TabLayout.TabsetTag(Object tag)ObjectgetTag()

添加图标

TabLayout.TabsetIcon(Drawable icon)TabLayout.TabsetIcon(intresId)DrawablegetIcon()

标题的文字

TabLayout.TabsetText(intresId)TabLayout.TabsetText(CharSequence text)CharSequencegetText()

当前标签位置

intgetPosition()

关联ViewPager

TabLayout和ViewPager配合使用是最常见的运用方式, 可以说量身打造. 这里我将介绍两种方式.

两者配合使用后TabLayout就不能通过自己创建Tab了, 需要PagerAdapter中实现 getPagerTitle() 方法返回标签的文字. 标签的数量有ViewPager的分页数量决定.

布局中嵌套

布局


代码

publicclassMainActivityextendsAppCompatActivity{@BindView(R.id.tab_layout)    TabLayout mTabLayout;@BindView(R.id.viewpager)    ViewPager mViewpager;privateArrayList mList;privateString[] mTitle;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        initData();        mViewpager.setAdapter(newPagerAdapter() {@OverridepublicintgetCount(){returnmList.size();            }@OverridepublicbooleanisViewFromObject(View view, Object object){returnview == object;            }@OverridepublicObjectinstantiateItem(ViewGroup container,intposition){                View view = mList.get(position);                container.addView(view);returnview;            }@OverridepublicvoiddestroyItem(ViewGroup container,intposition, Object object){                container.removeView((View) object);            }@OverridepublicCharSequencegetPageTitle(intposition){returnmTitle[position];            }        });    }    privatevoidinitData(){        View viewpagerA = getLayoutInflater().inflate(R.layout.viewpager_a,null);        View viewpagerB = getLayoutInflater().inflate(R.layout.viewpager_b,null);        View viewpagerC = getLayoutInflater().inflate(R.layout.viewpager_c,null);        mList =newArrayList<>();        mList.add(viewpagerA);        mList.add(viewpagerB);        mList.add(viewpagerC);        mTitle =newString[]{"首页","分类","设置"};    }

布局中关联

如果布局没有嵌套

就需要在ViewPager设置PagerAdapter之前关联两者

mTabLayout.setupWithViewPager(mViewpager);

虽然配合ViewPager后TabLayout创建的Tab并不能正常显示, 因为setupWithViewPager内部方法是先删除所有的标签再添加.

但是还是可以通过 getTabAt() 得到标签之后进行修改.

来自:http://liangjingkanji.coding.me/2017/03/03/TabLayout/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容