前言

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. 关于HTTP协议学习(三)

    一,目录结构 HTTPS HTTP/2 HTTP 安全 HTTP 面试 HTTP 爬虫 HTTP 资源 HTTP 抓包工具及教程 Chrome HTTP 插件 HTTP 代理服务器 HTTP 图书 二 ...

  2. Autofac之生命周期和事件

    Autofac为注册的类型对象提供了一套生命周期事件,覆盖了一个类型从注册到最后“释放”的一套事件.有了这些事件,我们可以相对方便的在类型对象的各个阶段进行AOP操作. builder.Registe ...

  3. Java学习--抽象类和接口

    https://www.cnblogs.com/dolphin0520/p/3811437.html 抽象类 先了解一下[抽象方法]—一种特殊的方法,只有声明,没有具体的实现  abstract vo ...

  4. 基于Promise封装uni-app的request方法,实现类似axios形式的请求

    https://my.oschina.net/u/2428630/blog/3004860 uni-app框架中 安装(项目根目录下运行) npm install uni-request --save ...

  5. java中使用JDBC的preparedStatement批处理数据的添加

    在项目中我们偶尔可能会遇到批量向数据库中导入数据,如果批处理的情况较多的情况下可以使用spring batch,如果只是一个导入功能的话可以考虑使用jdbc的preparedStatement处理. ...

  6. gradle入门教程

    1,https://gradle.org/ 下载过后解压缩,绿色软件不需要安装. 配置系统环境:GRADLE_HOME设置为解压缩之后的地址,PATH属性追加%GRADLE_HOME%\bin; 2, ...

  7. ln -s软链接文件算文件吗

    场景: 开发A在windows环境下完成了开发,配置管理员cm搭建jenkins在centos环境下编译,cm编译失败,但是开发A在他的windows环境下可以编译过,最后发现是某几个so文件的软链接 ...

  8. 2018-2019-2 网络对抗技术 20165321 Exp3 免杀原理与实践

    1. 实践内容(4分) 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellco ...

  9. TP5新增模块

    tp5模块自动生成 1build.php配置要生成的目录 <?php// +----------------------------------------------------------- ...

  10. Python 写了个小程序,耗时一天,结果才100多行

    from selenium import webdriver import selenium.webdriver.support.ui as ui from selenium.webdriver.co ...