TabLayout是开发中经常使用到的控件,经常与ViewPager一起配合使用,一组tab,可以点击、可以滚动。这不,我们的app中也是用到了这个控件,之前对这个控件只停留在最基本的用法,因此开发时也去查了些资料,趁着周末,就系统地再学习一下。

基本操作

使用之前,首先需要在gradle文件中加入design库,

    implementation 'com.android.support:design:28.0.0'

首先看一下最默认的行为与效果。 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><android.support.design.widget.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="56dp"></android.support.design.widget.TabLayout></android.support.constraint.ConstraintLayout>
tabLayout.addTab(tabLayout.newTab().setText("Tab 1").setIcon(R.mipmap.ic_launcher));tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));tabLayout.addTab(tabLayout.newTab().setText("Tab 3").setIcon(R.mipmap.ic_launcher));tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {@Overridepublic void onTabSelected(TabLayout.Tab tab) {Toast.makeText(MainActivity.this,tab.getText(),Toast.LENGTH_SHORT).show();}@Overridepublic void onTabUnselected(TabLayout.Tab tab) {}@Overridepublic void onTabReselected(TabLayout.Tab tab) {Toast.makeText(MainActivity.this,tab.getText(),Toast.LENGTH_SHORT).show();}});

setOnTabSelectedListener是一个过时方法,官方建议使用addOnTabSelectedListener代替,其中监听器接口是一样的,分别表示tab选中、未选中,再次选中状态。其中再次选中状态可以用于实现在选中tab的前提下,再点击时,滚动到最顶部的效果,比如很多资讯类app就是这么实现的。

效果图如下:

默认效果可以看到指示器红色,三个tab平分布局,有icon的显示在文字上方。 如果TabLayout的宽度wrap_content,那么三个tab将会挤到左边,每个tab的效果是wrap_content。

以上tab是通过代码添加的,也可以在xml中进行添加,效果等效于

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><android.support.design.widget.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="56dp"><android.support.design.widget.TabItemandroid:layout_width="match_parent"android:layout_height="match_parent"android:icon="@mipmap/ic_launcher"android:text="Tab 1" /><android.support.design.widget.TabItemandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="Tab 2" /><android.support.design.widget.TabItemandroid:layout_width="match_parent"android:layout_height="match_parent"android:icon="@mipmap/ic_launcher"android:text="Tab 3" /></android.support.design.widget.TabLayout></android.support.constraint.ConstraintLayout>

xml属性说明

对于TabLayout的样式修改,一些可以通过修改属性就行修改。

修改指示器

可以修改指示器的颜色和高度,比如:

<android.support.design.widget.TabLayoutapp:tabIndicatorColor="@android:color/holo_green_dark"app:tabIndicatorHeight="10dp"android:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="56dp"/>

效果如下:

修改文字样式

  1. 选中和未选中颜色设置
app:tabSelectedTextColor="#FF0000"app:tabTextColor="#0000FF"

效果如下图:

2. 修改文字大小
使用textAppearence属性,在style文件中设置大小。

        app:tabTextAppearance="@style/my_tab_text_style"

my_tab_text_style内容如下:

<style name="my_tab_text_style"><item name="android:textSize">20sp</item><item name="android:textStyle">bold</item></style>

效果如下:

修改tab样式

  1. 使用padding参数,可以使用tabPadding进行设置,比如:

    <android.support.design.widget.TabLayoutapp:tabPaddingTop="20dp"android:paddingBottom="20dp"android:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="wrap_content">
    

    可以看到预览图的效果如下:

  2. tabMode。tabMode支持两种值,MODE_FIXED和MODE_SCROLLABLE;当tab比较多,一屏容纳不下时,会使用MODE_SCROLLABLE,这时可以隐藏部分MODE;而FIXED的就会始终显示。

    当在xml布局中添加了很多TabItem后,预览效果如下图:

    这时使用的就是FIXED模式,可以看到TabLayout默认就是FIXED模式;当改成MODE_SCROLLABLE后,

            app:tabMode="scrollable"
    

    预览样式如下图:

  3. Tab位置。当只有三个tab时,默认分散了,如果想三个tab聚合起来,可以通过设置tabGravity属性进行设置,比如:

            app:tabGravity="center"
    

    设置后的效果如下:

    设置前的效果就是前面三个tab平铺的效果。改属性的默认值是fill。

    另外,可以通过设置tabContentStart设置偏移量,类似margin。

    比如设置:

            app:tabContentStart="100dp"
    

    后的效果如下图:

  4. 设置tab背景。tabBakcground属性,比如设置的样式如下:

    <shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><sizeandroid:width="50dp"android:height="30dp"></size><gradientandroid:startColor="#FF0000"android:endColor="#0000FF"></gradient></shape>
    

    效果图:

  5. tab宽度,可以通过设置tabMaxWidth和tabMinWidth进行限制。

TabItem样式自定义

以上的xml样式,都可以通过相应的set方法进行设置,但是如果想改变默认的tab样式,那么就需要代码的操作了。默认的tab样式,icon在上,text在下;下面改个icon在左,text在右的样式。

首先定义一个布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"xmlns:tools="http://schemas.android.com/tools"android:layout_height="48dp"xmlns:app="http://schemas.android.com/apk/res-auto"><ImageViewandroid:padding="12dp"android:id="@+id/iv_icon"tools:src="@mipmap/ic_launcher"android:layout_width="48dp"android:layout_height="48dp" /><TextViewapp:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:textSize="18sp"android:textColor="#333333"android:id="@+id/tv_text"android:layout_width="0dp"android:layout_height="21dp"app:layout_constraintLeft_toRightOf="@id/iv_icon"app:layout_constraintRight_toRightOf="parent"tools:text="hha" /></android.support.constraint.ConstraintLayout>

然后在代码中更改TabLayout现有Tab样式,代码如下:

tabLayout=findViewById(R.id.tabLayout);for (int i = 0; i < tabLayout.getTabCount(); i++) {TabLayout.Tab tab = tabLayout.getTabAt(i);View view=LayoutInflater.from(this).inflate(R.layout.my_tab_layout,null);tab.setCustomView(view);((ImageView)view.findViewById(R.id.iv_icon)).setImageDrawable(tab.getIcon());((TextView)view.findViewById(R.id.tv_text)).setText(tab.getText());}

运行结果如下图:


可以看到tab样式已经变成了icon在左,文字在右的样式。

集成ViewPager

布局如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><android.support.design.widget.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="56dp"></android.support.design.widget.TabLayout><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"app:layout_constraintTop_toBottomOf="@id/tabLayout"app:layout_constraintBottom_toBottomOf="parent"android:layout_width="match_parent"android:layout_height="0dp"></android.support.v4.view.ViewPager></android.support.constraint.ConstraintLayout>

代码如下:

public class MainActivity extends AppCompatActivity {private TabLayout tabLayout;private ViewPager viewPager;private int[] imgs=new int[]{R.drawable.pic_11,R.drawable.pic_12,R.drawable.pic_11};private String[] tabs=new String[]{"Tab 1","Tab 2","Tab 3",};private List<ImgFragment> imgFragments=new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tabLayout=findViewById(R.id.tabLayout);viewPager=findViewById(R.id.viewpager);for (int i = 0; i < imgs.length; i++) {imgFragments.add(ImgFragment.newInstance(imgs[i]));}viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {@Overridepublic Fragment getItem(int i) {return imgFragments.get(i);}@Overridepublic int getCount() {return imgFragments.size();}@Nullable@Overridepublic CharSequence getPageTitle(int position) {return tabs[position];}});tabLayout.setupWithViewPager(viewPager);}
}

运行效果如下:

这里需要注意的是:当调用了setupWithViewPager之后,tab值默认将会从getPageTitle中获取;如果这个时候没有重写PageAdapter的getPageTitle,那么效果将会如下图:

这个时候可以发现TabLayout上面都是空的,但其实是有tab的,只不过tab内容为空而已。这个时候可以通过代码重新设置,比如:

tabLayout.setupWithViewPager(viewPager);for (int i = 0; i < tabLayout.getTabCount(); i++) {TabLayout.Tab tab=tabLayout.getTabAt(i);tab.setText(tabs[i]);tab.setIcon(imgs[i]);}

效果如下图:

可以看到,不止设置了text,还设置了title,使用PageAdapter只能设置text。

总结

至此,TabLayout的基本用法也就是这样了;除了这个,还有与Toolbar以及协调布局共同使用的情况,这个以后有机会会继续深入的学习下。

DEMO地址

参考内容

  • https://developer.android.com/reference/android/support/design/widget/TabLayout
  • TabLayout之自定义样式
  • MaterialDesign之对TabLayout的探索
  • Design库-TabLayout属性详解

TabLayout使用指南相关推荐

  1. AppBarLayout中的Android TabLayout

    In this tutorial, we'll discuss and implement Android TabLayout in our android application. Also we' ...

  2. 超详细中文预训练模型ERNIE使用指南-源码

    作者 | 高开远,上海交通大学,自然语言处理研究方向 最近在工作上处理的都是中文语料,也尝试了一些最近放出来的预训练模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比对 ...

  3. 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题

    入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...

  4. ASIC设计-终极指南

    ASIC设计-终极指南 ASIC Design – The Ultimate Guide ASIC设计-终极指南 ASICs代表特定于应用的集成电路,指的是针对特定应用而设计的半导体解决方案,与其他解 ...

  5. Python神经网络集成技术Guide指南

    Python神经网络集成技术Guide指南 本指南将介绍如何加载一个神经网络集成系统并从Python运行推断. 提示 所有框架的神经网络集成系统运行时接口都是相同的,因此本指南适用于所有受支持框架(包 ...

  6. 深度学习框架集成平台C++ Guide指南

    深度学习框架集成平台C++ Guide指南 这个指南详细地介绍了神经网络C++的API,并介绍了许多不同的方法来处理模型. 提示 所有框架运行时接口都是相同的,因此本指南适用于所有受支持框架(包括Te ...

  7. TabLayout的指示器长度 的问题

    刚开始效果图 修改后的效果图 这个效果实现 就是在 tablayout 的xml 里面添加 app:tabIndicatorFullWidth="false"

  8. TabLayout 在宽屏幕上tab不能平均分配的问题解决

    TabLayout 在屏幕比较宽的屏幕上的时候 ,不如平板,特质的屏幕的时候 tabMode="fixed" 这个时候就是失效了 显示失效了 是居中的效果 这个修改方法就是在xml ...

  9. Tablayout 多个界面使用一个fragment 的实例

    这个主要还是adapter 里面 添加list 就行了 这里直接上代码吧 ,我刚写的demo 看的时候看adapter 就行了 布局代码: <?xml version="1.0&quo ...

最新文章

  1. python连接elasticsearch查询数据
  2. php kml文件解析,英语翻译中文:详细分析了KML、MapInfo文件及二者之间的联系,以KML点标记文件为例,基于PHP编程实现了KML到...
  3. leetcode111. 二叉树的最小深度(层序遍历10)
  4. 基于webpack搭建的vue element-ui框架
  5. js中追加写入文件(字符串追加)_note
  6. 【elasticsearch】elasticsearch 升级
  7. Jmail 发送邮件错误
  8. Kubernetes支持有状态服务的部署
  9. VScode+Latex:代码和pdf互相跳转
  10. c语言二元一次方程代码,二元一次方程(示例代码)
  11. Codeforces 1359 C. Mixing Water (二分 /数学)
  12. vcs+verdi/Debussy
  13. 马帅:我的同事王开源-真正开源斗士
  14. 十大数据挖掘领域的经典算法
  15. 如何解决‘CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate’错误
  16. Java 阿里云实人认证
  17. APP性能测试——基于手机的专项测试
  18. python之pypinyin
  19. 龙珠激斗获取服务器信息中,龙珠激斗战力220000贝吉塔快速获得途径攻略汇总详解...
  20. 交互媒体技术—2D迷宫冒险游戏

热门文章

  1. SpringBoot访问windows共享文件
  2. MCU(单片机)datasheet(规格说明书)
  3. 终于获得IBM认证数据库管理员
  4. oracle中rac是什么意思,学习猿地-oracle rac是什么?
  5. 中兴ZTE ZXR10-3928A重置console密码
  6. A - 两只脑斧 Gym - 102174A
  7. 3D点云(3D point cloud)及PointNet、PointNet++
  8. 图像处理(2)--二值图像
  9. 学校计算机教室报损登记本,学校设施设备管理制度规定
  10. 中科软测试面试题2019_中科软科技股份有限公司面试经验