Design库-TabLayout属性详解

作者: 积木Blocks | 来源:发表于2016-06-02 01:17 被阅读107404次

上图是简书Android端的主页Tab,在其他的App中Tab也是很常见的,它的实现方式也有很多:TabHost,自定义控件(第三方库),RadioGroup等等。这里主要介绍Android Design库中的TabLayout的使用。


1.什么是TabLayout

在源码中给出了TabLayout的定义:

TabLayout provides a horizontal layout to display tabs.

意思很明显:TabLayout提供了一个水平的布局用来展示Tabs。

Design库:AS有直接的引用,如果是Eclipse这里提供一个通道-Design库

特别说明:

Caused by: java.lang.IllegalArgumentException: You need to use a Theme.AppCompat theme (or descendant) with the design library.

在清单文件中设置如下代码即可:

android:theme="@style/Theme.AppCompat"


2.TabLayout的基本使用方式

方式一:

1.在布局中加入该控件:

<android.support.design.widget.TabLayout

          android:id="@+id/tabLayout"

          android:layout_width="wrap_content"

          android:layout_height="wrap_content"/>

2.在代码中

tabLayout= (TabLayout) findViewById(R.id.tabLayout);

tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));

tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));

tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));

3.显示效果

感觉还不错吧,挺简单就实现了这个UI效果。

方式二:

<android.support.design.widget.TabLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content">

<android.support.design.widget.TabItem

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Tab1"/>

...

</android.support.design.widget.TabLayout>

这样同样也可以实现方式一的效果,可是单单这样并不能满足我们。于是接下来看看有什么属性可以使用。


3.改变下TabLayout的颜色

上面的Tab颜色感觉不好看,打算换换:

1.改变选中字体的颜色

app:tabSelectedTextColor="@android:color/holo_orange_light"

2.改变未选中字体的颜色

app:tabTextColor="@color/colorPrimary"

3.改变指示器下标的颜色

app:tabIndicatorColor="@android:color/holo_orange_light"

4.改变整个TabLayout的颜色

app:tabBackground="color"

于是现在我的Tab变成了这个样子:


4.改变TabLayout内部字体大小

总觉得这个字体有点小了,于是想找方法把这个字变得大一点,

好像没有直接变大的方法,可是找到了这个:

app:tabTextAppearance="@android:style/TextAppearance.Holo.Large"//设置文字的外貌

效果:


5.改变指示器下标的高度

既然字体变大了,指示器太小就显得不太好看了,

设置指示器下标的高度:

app:tabIndicatorHeight="4dp"

效果:


6.添加图标

有时候Tab只有文字感觉有点单调了:

tabLayout.addTab(tabLayout.newTab().setText("Tab 1").setIcon(R.mipmap.ic_launcher));


7.Tab的模式

数据很多的时候我们应该怎么办呢,简书中的第二个Tab就是可以滑动的:

我们先多加几个tab:

tabLayout.addTab(tabLayout.newTab().setText("Tab 4"));

tabLayout.addTab(tabLayout.newTab().setText("Tab 5"));

tabLayout.addTab(tabLayout.newTab().setText("Tab 6"));

tabLayout.addTab(tabLayout.newTab().setText("Tab 7"));

然后设置属性为:

app:tabMode="scrollable"

默认是fixed:固定的,标签很多时候会被挤压,不能滑动。

效果如下:


8.加入Padding

设置Tab内部的子控件的Padding:

app:tabPadding="xxdp"

app:tabPaddingTop="xxdp"

app:tabPaddingStart="xxdp"

app:tabPaddingEnd="xxdp"

app:tabPaddingBottom="xxdp"

设置整个TabLayout的Padding:

app:paddingEnd="xxdp"

app:paddingStart="xxdp"


9.内容的显示模式

app:tabGravity="center"//居中,如果是fill,则是充满


10.Tab的宽度限制

设置最大的tab宽度:

app:tabMaxWidth="xxdp"

设置最小的tab宽度:

app:tabMinWidth="xxdp"


11.Tab的“Margin”

TabLayout开始位置的偏移量:

app:tabContentStart="100dp"


12.TabLayout的监听事件

选中了某个tab的监听事件OnTabSelectedListener():

tabLayout.setOnTabSelectedListener(newTabLayout.OnTabSelectedListener() {

@Override

public voidonTabSelected(TabLayout.Tab tab) {

//选中了tab的逻辑

}

@Override

public voidonTabUnselected(TabLayout.Tab tab) {

//未选中tab的逻辑

}

@Override

public voidonTabReselected(TabLayout.Tab tab) {

//再次选中tab的逻辑

}

});


13.和ViewPager的联动

最后也是最重要的:

tabLayout.setupWithViewPager(Viewpager);

一行代码和ViewPager联动起来,简单粗暴。


14.简单模仿简书Android端的Tab

主要就是设置下标的高度为0,相当于没有下标。

app:tabIndicatorHeight="0dp"

然后设置背景颜色以及选中文字颜色

app:tabSelectedTextColor="#ff7a61"

app:tabBackground="#f6f4f2"//这里不能直接写RGB,需要@color/xx

最后设置Tab的模式:

app:tabMode="scrollable"

当然Tablayout还可以做很多的样式,如果有关于Tablayout的注意事项或者相关知识的文章,希望大家可以分享给我,多谢!


15.仿京东商品详情Android端的Tab

主要原理是setCustomView()加载自定义视图,来实现字体大小的改变,默认的TabLayout不能改变。

Design库-TabLayout仿京东商品详情Tab


补充:默认选中某项

tablayout.getTabAt(position).select();

相关文章

网友评论

  • JefferyzZ:大佬,当tab条目只有一条时,如何横向铺满
    024d031213ed:设置app:tabMode 和app:tabGravity
  • f6477d75def0:请问如何设置TabLayout的整体高度呢?
  • 62dc855a3a8d:我想问的是设置字体大小的那个样式是楼主自定义的还是as自带的?我没找到这个样式
  • e3e5895f2b06:你好怎么去掉底部那个指示器的横线
    024d031213ed:上面有写 app:tabIndicatorHeight="0dp"
    30035123f1bc:你要去掉还用什么tabLayout哦
  • 薅韭菜:楼主,我的tab30个我可以控制他只显示 5个吗
    024d031213ed:没有实现不了的需求
  • CPLASF1925:tabIndicatorColor不设置颜色的话,默认是colorAccent吗
  • 慢行的骑兵:楼主帅气,写的很详细的文章,请问楼主3个问题.
    1,下滑线的宽度控制;
    2,下划线小矩形四个角能设置圆角吗.
    3,被选中的tab字体放大.
    谢谢.
    024d031213ed:这种只能重写tablayout
    奇梦人:字体放大我也在找 可以分享一下吗
  • Mr_Rains:请问怎么设置字与下标指示器的间距啊
  • honglei92:很好很强大
  • cb9ceedb1def:tab item之间的那个竖线怎么设置
  • King4Ghost:我遇到一个问题就是:我的TabLayout有2个tab,叫1和2. 使用viewpager一起使用,1和2分别对应2个fragment。默认是1选中,当我点击时,是正确切换了,且tab 2的字体也变为选中的颜色了。但是,问题就在这里,tab 2选中了但它下面的那根小线却跑到tab 1下面了。由此错乱了,当点击tab 1,下方那根选中的线却跑到tab2这个非选中状态下的tab下去 了。为何?
  • 8a9b333eb182:这个能不能修改字体大小。百度上说的 修改个style 貌似我怎么试都不生效。。。
    积木Blocks:@Idcrow 这个是一开始默认选择显示哪个tab,你需要在监听方法中,根据不同的tab来显示不同的ViewPager中的fragment实现联动,参考:http://www.jianshu.com/p/116f87abdaea
    Idcrow:大神,根据状态不同进去不同的标签,你说的方法我用了为什么没有反应啊,tablayout.getTabAt(position).select() 是这个吗 ,我的没反应,在线等,很急。。。
    积木Blocks:app:tabTextAppearance 这个属性可以修改字体的外观,可以通过这个属性来修改字体大小
  • 953f718cea22:选中tab字体大小怎么设置呢
    积木Blocks:可以看下第15条
  • 小默森:大神,标签不平分,怎么破?
    小默森:@自导自演的机器人大神, 每个标签一样大后,底下的线有点长,还能调节吗?
    小默森:@自导自演的机器人 好,谢谢哈
    积木Blocks:app:tabMinWidth="100dp"
    app:tabMaxWidth="100dp" 这样每个标签大小都一致了
  • fe84c5744706:如何设置每个tab的固定宽度,比如我的应用正常情况下一屏幕显示5个tab 我想显示6个该怎么做 能够把tab的宽度改小一点吗
    积木Blocks:@jinchou app:tabMode="scrollable"
    app:tabMinWidth="100dp"
    app:tabMaxWidth="100dp"
    fe84c5744706:@自导自演的机器人 我的意思是我有很多tab可以滑动的不是固定的
    我是想修改tab宽度 让一个屏幕能多显示几个tab
    积木Blocks:@jinchou app:tabMode="fixed" 这个属性会让tab自动填充满整个屏幕
  • 锕鎖:tab之间 间距怎么调?
    积木Blocks:@锕鎖 你指的是下划线的宽度么
    锕鎖:@自导自演的机器人 我试过了,不管用
    积木Blocks:可以通过app:tabPadding来调整tab之间的距离
  • 风动天下:感谢机器人分享,深入浅出,比某些大神写的还棒
  • 年轻的爱是个善良的哑巴:如何自定义TabLayout下划线的宽度?
    奋斗吧小青年之筱柒: @年轻的爱是个善良的哑巴 宽度可以通过反射搞定
    积木Blocks:@假开心or真孤独 这个没有实现过,没有找到相关api
  • 浅安流年:感谢分享,学习了。
    积木Blocks:@浅安流年 客气了
  • ThrowException:与ViewPager联动之后,导致tablayout的标签的文本丢失了,下面是一种解决方法:
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.getTabAt(0).setText("tab1");
    tabLayout.getTabAt(1).setText("tab2");
  • ThrowException:Thanks for your sharing
  • b5c8140617e8:感谢楼主。找了半天,最后用google才搜索到:tablayout.getTabAt(position).select();这个。用百度花了半天时间给的都是addtab方案,气死。。。
  • 65b2d5c1ffa8:请问 设置Mode:scrollable,多个标签(超过屏幕显示)选中最后一个,用mTabLayout.getTabAt(mCurrentIndex).select(); 标签是选中了,
    但是,不居中显示。。。怎么解决呢
  • 今生挥毫只为你:6666666,折腾了一上午,终于解决了
  • smartapple:为什么我seticon 那个icon的图标不显示出来啊 好奇怪 而且图标的位置能够在上下左右任意的地方吗 怎么我试了好多种方法都没法实现呢 纠结ing

    积木Blocks:@四条眼的小胖子 也可能是高版本的design没了,http://www.jianshu.com/p/e2a8791e80d6看看这个是否满足你需求。
    smartapple:不是。网上说 seticon这个方法 被禁用了 试了好多次都没实现
    积木Blocks:@四条眼的小胖子 可以看看,是不是tablayout本身高度不够,官方提供的图标位置只能是在上方的。
  • 99266394a967:可以设置选中以后显示图片吗?
  • Michael_Meng:请问该怎么设置选中字体比未选中字体大,还有下面的指示器的宽度和文字宽度保持一致?
    sakura_L:@Michael_Meng 底部的指示器本事是linearlayout 你反射出来自定义他的宽度,但是这个宽度你要自己计算比较麻烦
    sakura_L:@自导自演的机器人 这个是可以的 可以自定义指示器的宽度,通过反射;还有这个可以转载或者引用吧?
    积木Blocks:@Michael_Meng http://www.jianshu.com/p/116f87abdaea修改选择字体大小的方法,指示器宽度是和tabitem大小一致没办法修改,你可以换下其他方式实现,比如其他开源库https://github.com/hackware1993/MagicIndicator
  • chefish:写的不错,支持一下
  • Eania:类似uc新闻,顶部导航那种,怎么区分哪个fragment对应哪个频道
    昵称真难选:@弄伪装 可以用Map来管理,把【频道】和【fragment】分别作为key/value放进map中,这样就可以屏蔽掉顺序不对带来的隐患,方便后续的修改。
    积木Blocks:@弄伪装 ViewPager的适配器加载的Fragment是按照顺序添加的,tab也是按照顺序添加的。第一个fragment就对应于第一个tab,以此类推。
  • 2d8c4007d54a:请问 假如有39个tab,scrollable的时候,可以设置只显示3个tab吗?怎么设置?
    我是昵称:@又又不知道怎么取名字 可以设置tab的最小宽度,然后设置居中就好;
    eg:
    app:tabMinWidth="128dp"
    app:tabGravity="center"
    我是昵称:@自导自演的机器人 不知道就说不知道,说什么没有,自己理解不够就不要误导他人
    积木Blocks:@又又不知道怎么取名字 没有这个功能应该。
  • 5b9d20d2db03:突然发现简书真是一个很不错的网站
    5b9d20d2db03: @mByte 然后呢?
    Alimin利民:@渴望吃胖的不老君 那是因为你还没看透简书,表示已对简书无爱
    hongjay:@渴望吃胖的不老君 不..只是这篇质量不错
  • 1da07439ae7f:和ViewPager联动,需要重写adapter 的getTitle,否则无法显示TabLayout上的标签
    流影连月:正解 赞
    1da07439ae7f:@SvenHe 说错了:getPageTitle
  • Ucoon:能设置tab默认选中哪一个吗
    积木Blocks:@Ucoon tablayout.getTabAt(position).select(); 不好意思之前有点忙
    Ucoon:@自导自演的机器人 怎么写,找不到方法:joy::joy::joy:
    积木Blocks:@Ucoon 你可以在监听事件里面书写
  • 兰亦辛:这个 可以 垂直嘛?????
    积木Blocks:@兰亦辛 应该是不行的,因为他继承的是HorizontalScrollView.
  • 捡淑:不错,好文
    e156012376cf:大哥 又碰到你 头像怎么回事 :flushed:
    恨自己不能小清新:@捡淑 大哥 又碰到你 头像怎么回事 :flushed:
    积木Blocks:@AlaricNorris 谢谢:grin:
  • 谈小龙:太好了,正好需要😁😁😁
    积木Blocks:@谈小龙 :relieved:和Fragment的联动这块写的不是很好

本文标题:Design库-TabLayout属性详解

本文链接:https://www.haomeiwen.com/subject/akhhdttx.html