前言

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. C++11 新特性之operator "" xxx

    从C++11开始,我们可以使用以下形式通过常量字符串构造自定义类型, 比如: class Person { public: Person(const std::string& name): _ ...

  2. pandas(二)

    层级索引: index=[('a',2010),('b',2011),('c',2010'),('a',2012),('e',2010),('f',2011)] age=[18,17,18,16,18 ...

  3. ADB——应用交互

    使用ADB与手机应用交互 应用交互的操作包括:启动应用 / 调起Activity.调起Services.停止Service.发送广播.强行停止应用 基本命令 am <command> 常用 ...

  4. allegro把formate symbol文件从一个文件拷入另一个文件的方法

    allegro画好PCB后经常需要添加一些说明谢谢,比如叠层信息.阻抗表等,但是每次都自己画太麻烦,现在就写下如何重复使用各种格式. 1.打开包含这些信息的板子,FILE-> Export -& ...

  5. crypto++

    CryptoPP库是一个C++书写的加密算法库,很棒. 在如今的抛却数字证书体系下,只关注公私钥对的情况下,我认为存粹的加解密算法库很有市场,虽然我以前觉得PolarSSL的加解密算法实现不错,但不影 ...

  6. 关于11G DataGuard 日志传输的案例

    案例探讨 在归档和非归档模式下,配置参数log_archive_dest_2后,DG的备库是否传输日志. 案例环境描述 本次环境如下,一套RAC+单机DG,然后从DG还原出来一个单独的测试库A,测试库 ...

  7. 微信小程序封装年月日时分组件

    第一步,在page下新建component文件,放你封装的小组件,和vue里的component差不多 第二步,在需要使用的组件的.json文件中添加usingComponents 第三步,在页面中引 ...

  8. #WEB安全基础 : HTTP协议 | 0x9 GET和POST请求以及请求URI的方式

    请求URI的方式 1.URI为完整的请求URI GET http://hackr.jp/index.htm HTTP/1.1 2.在首部字段Host中写明域名或IP地址 GET/index.htm H ...

  9. 软件测试之Soot

    详情请见:https://github.com/fogmisty/SoftwareTest  

  10. ubuntu16.04利用deb包安装mysql

    https://blog.csdn.net/zht741322694/article/details/79013093