前言

Tablayout继承自HorizontalScrollView,可以用作顶部标签效果、底部导航栏效果。一般多与ViewPager一起使用。

想直接了解如何实现短下滑效果的请看:TabLayout的高级用法

首先上几个效果图。

图:

使用方法

下面我们来看如何使用,

第一步,先在gradle引入支持包

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

第二步,在布局文件中添加布局

<android.support.design.widget.TabLayout
android:id="@+id/tab_normal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorHeight="2dp"
app:tabMode="fixed"
app:tabIndicatorColor="#0a0"
app:tabTextColor="#bbb"
app:tabSelectedTextColor="#0a0"
/>

属性解释:

tabIndicatorHeight:这里是设置标签横线的高度,如果不需要横线,可以设置为0dp
tabIndicatorColor:是用来设置标签被选中时,显示的颜色的。
tabTextColor:标签显示的默认颜色
tabSelectedTextColor:标签被选中的时候的颜色
tabMode:这个属性有两个取值,一个是fixed,不管tab标签字多字少,平分当前tablayout宽度的空间大小。一般最多折两行,还显示不开的部分,用省略号代替。
              另一个是scrollable,从左到右依次显示标签,显示不开的,可以滚动显示


上代码

java代码:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.design.widget.TabLayout;
import java.util.ArrayList;
import java.util.List; import butterknife.BindView;
import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity { @BindView(R.id.tab_normal)
TabLayout tabNormal;
@BindView(R.id.tab_icon)
TabLayout tabIcon;
@BindView(R.id.tab_more)
TabLayout tabMore;
@BindView(R.id.tab_customer)
TabLayout tabCustomer;
@BindView(R.id.vp_all)
ViewPager vpAll; List<PageFragment> fgList; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);//此处是用的是butterKnife框架,等同于findviewbyid获取各个控件。
initViewPager();
initTabNormal();
} /**
* 初始化ViewPager,方便后期与tabLayout关联
*/
private void initViewPager() {
fgList = new ArrayList<>();
for (int i = 0; i < 4; i++) {
fgList.add(PageFragment.newInstance("我是标题"+i,"我是内容栏目"+i));
}
vpAll.setAdapter(new ViewPagerAdapter(getSupportFragmentManager(), fgList) );
} /**
* 初始化顶部标签
*/
private void initTabNormal() {
tabNormal.setupWithViewPager(vpAll);
} /**
* ViewPager的适配器。
*/
class ViewPagerAdapter extends FragmentPagerAdapter{ List<PageFragment> fragmentList;
public ViewPagerAdapter(FragmentManager fm, List<PageFragment> fragmentList) {
super(fm);
this.fragmentList=fragmentList;
} @Override
public Fragment getItem(int position) {
return fragmentList.get(position);
} @Override
public int getCount() {
return fragmentList.size();
} @Override
public CharSequence getPageTitle(int position) {
return fragmentList.get(position).getTitle();
}
}
}

fragment代码,fragment的布局文件,就一个ID为tv_content的textview,此处就不在贴代码了。

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; import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder; public class PageFragment extends Fragment {
String title, content;
@BindView(R.id.tv_content)
TextView tvContent;
Unbinder unbinder; public PageFragment() {
} public static PageFragment newInstance(String title, String content) {
PageFragment fragment = new PageFragment();
fragment.title = title;
fragment.content = content;
return fragment;
} @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); } @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_page, container, false);
unbinder = ButterKnife.bind(this, view);
tvContent.setText(content);
return view;
} public String getTitle() {
return title;
} @Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}

通过tabLayout方法的setupWithViewPager()方法绑定ViewPager控件的。tab标签获取显示文字,是通过FragmentPagerAdapter的getPageTitle()方法。所以需要对FragmentPagerAdapter的getPageTitle方法进行重写。

然而,原生控件有很多的呆笨性。比如很多的UI和场景需求都是要求文字下面的短线是一个小于文字的固定值。再比如我们说的作为底部导航栏,如果直接设置tab的icon,会出现icon变形等问题。

所以我这里给一个终极的解决办法。tab想做成什么样子,就做成什么样子。完全自定义。

传送门:TabLayout的高级用法,自定义TabLayout

 

TabLayout基本使用的更多相关文章

  1. TabLayout + ViewPager

    一.实现思路 1.在build.gradle中添加依赖,例如: compile 'com.android.support:support-v4:23.4.0'compile 'com.android. ...

  2. 安卓Design包之TabLayout控件的简单使用

    Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个supp ...

  3. TabLayout+ViewPager+Fragment制作页卡

    本人很懒,直接上代码了. 布局文件: <?xml version="1.0" encoding="utf-8"?><android.suppo ...

  4. design包 TabLayout使用

    类似"网易新闻"UI设计就很好,顶部是导航,下面是各个页面.如图 这种效果使用design包中的TabLayout可以轻松的实现.   一.分析TabLayout 常见 UI 上图 ...

  5. 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab

    大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHo ...

  6. TabLayout和ViewPager简单实现页卡的滑动

    首先需要在当前的module中的build Gradle的 dependencies中加入以下句子 compile 'com.android.support:design:23.0.1' 因为我们用到 ...

  7. TabLayout和ViewPager联动时的问题及解决方案

    问题概述 TabLayout搭配ViewPager关联使用时,在未调用TabLayout的setupWithViewPager(mViewPager)方法之前,ViewPager的内容和TabLayo ...

  8. TabLayout 简单使用。

    先上效果图 在使用TabLayout 之前需要导入design包. 我使用的是android studio 只要在build.gradle中加入 compile 'com.android.suppor ...

  9. CoordinatorLayout+TabLayout+ViewPager

    <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.C ...

  10. 浅谈TabLayout(ViewPager+Tab联动)

    google发布了的Android Support Design库中提供了TabLayout 通过TabLayout+ViewPager实现导航栏效果,点击Tab ,ViewPager跟随变化,滑动V ...

随机推荐

  1. 单元测试-unittest模块

    1.简单的一个实例 import unittest def calc(a,b): return a+b class MyTest(unittest.TestCase): def testa(self) ...

  2. Mac下StarUML的安装以及破解

    1.下载地址:http://staruml.io/ 2. 打开 /Applications/StarUML.app/Contents/www/license/node/LicenseManagerDo ...

  3. 发现了一个比较有意思的url参数

    今天登录阿里云发现需要二次验证了,手机号不是我的很麻烦,然后就看到有个手机app快捷登录的方式,点进去一看,链接地址是这样的http://qd.alibaba.com/onekey.htm?spm=0 ...

  4. Android数据库无缝升级方案

    软件迭代过程中,业务不断更新,也要求软件持续更新.相应地,数据库更新升级也是不可避免的一个环节.Android作为客户端应用,数据库升级相对于服务端来说会麻烦一些.常见的升级方式有: 1.删除旧表和数 ...

  5. Spring+Mybatis 复杂的分组查询

    1.需要的结果数据格式为 { "responseCode": "0000", "responseMsg": null, "data ...

  6. C#基础加强(6)之引用相等与运算符重载

    引用相等 介绍 在 C# 中可以通过 object.ReferenceEquals(obj1, obj2) 方法来判断两个变量引用的是不是同一个地址,如果是,那么就是引用相等. 引用相等是针对引用类型 ...

  7. React表格报错Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key.

    解决: <Table bordered rowKey={record=>record.id} //解决 components={this.components} columns={colu ...

  8. supervise守护进程

    通过二进制supervise文件可以直接对进程进行守护 ./supervise -f  要守护的程序 -p  守护信息存储位置 例如: ./supervise -f  http_server -p s ...

  9. Wed Sep 19 20:48:46 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection mus

    Wed Sep 19 20:48:46 CST 2018 WARN: Establishing SSL connection without server's identity verificatio ...

  10. C# Unity依赖注入

    简介: 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的手中,在这个过程中你不是一个控制者而是一个请求者,依赖于容器提供给你的资源,控制权落到了容器 ...