前言

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. cve-2018-4878漏洞复现

    CVE-2018-4878Flash 0day漏洞1.漏洞概述2018年2月1号,Adobe官方发布安全通报(APSA18-01),声明Adobe Flash 28.0.0.137及其之前的版本,存在 ...

  2. 软件开发项目组各职能介绍 & 测试人员在团队中的定位

    前言     接触了许多非测试和新入行的测试从业者,听到最多的问题就是:“测试是否被需要?“   团队职能介绍     <暗黑者1>中有句台词,“专案组有五个职能角色构成,侦探.网警.痕迹 ...

  3. iOS 控制台po不出值

    本人这几天开发项目时在控制台用po命令打印时,发现总是打印不出来,这里将我的解决方案推荐给大家 方法一:(本人就是用该方法解决了问题的) 在控制台选择All Output 方法二: 按图中指示选择de ...

  4. Python文件常用操作方法

    Python文件常用操作方法 一.对File对象常用操作方法: file= open(file, mode='r', buffering=-1, encoding=None, errors=None, ...

  5. js中创建命名空间的几种写法

    在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hel ...

  6. try catch的使用场景

  7. JAVA8 中 LocalDateTime的使用小栗子

    LocalDate givenDate = LocalDate.parse("2019-04-23",DateTimeFormatter.ofPattern("yyyy- ...

  8. 《linux就该这么学》第十四节课:第13章,部署DNS域名解析服务(bind服务)

    (借鉴请改动)  第十二章收尾  12.2.nfs网络文件系统 RHEL7默认安装了nfs,配置文件在  /etc/export  写入格式:共享目录    允许的客户端(参数)  ro        ...

  9. Qt QLabel 显示gif动图

    #include <QMovie> QMovie * move = new QMovie(":/gif/牵着我的手去浪迹天涯.gif"); ui->label_g ...

  10. Elasticsearch.安装(单节点)

    Elasticsearch.安装(单节点) 环境Linux 7.x jdk 1.8 elasticsearch 5.x 环境目录结构(根目录多了两个文件夹): /resources    /** 存放 ...