TabLayout_tablayou tabgravity-程序员宅基地

TabLayout是design库提供的控件,可以方便的使用指示器,功能类似ViewPagerIndicator. 
使用非常方便,Android Studio只需要在gradle中引入即可使用 .

?
1
compile 'com.android.support:design:23.3.0'

TabLayout即可以单独使用,也可以配合ViewPager来使用. 

先来看看单独使用的Demo,实现如下图的效果: 

这里写图片描述

代码如下:

?

packageblog.csdn.net.mchenys.tablayoudemo;
 
importandroid.graphics.Color;
importandroid.os.Bundle;
importandroid.support.design.widget.TabLayout;
importandroid.support.v7.app.AppCompatActivity;
importandroid.view.Gravity;
importandroid.view.ViewGroup;
importandroid.widget.Toast;
 
/**
 * Created by mChenys on 2016/5/28.
 */
publicclass TabLayoutOnlyActivity extendsAppCompatActivity {
 @Override
 protectedvoid onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //创建TabLayout
  TabLayout tabLayout = newTabLayout(this);
  tabLayout.setLayoutParams(newViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 60));
  //tab可滚动
  tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
  //tab居中显示
  tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
  //tab的字体选择器,默认黑色,选择时红色
  tabLayout.setTabTextColors(Color.BLACK, Color.RED);
  //tab的下划线颜色,默认是粉红色
  tabLayout.setSelectedTabIndicatorColor(Color.BLUE);
  for(inti = 0; i < 20; i++) {
   //添加tab
   tabLayout.addTab(tabLayout.newTab().setText("TAB"+ i));
  }
  finalToast toast = Toast.makeText(this,"", Toast.LENGTH_SHORT);
  toast.setGravity(Gravity.CENTER,0,0);
  //设置tab的点击监听器
  tabLayout.setOnTabSelectedListener(newTabLayout.OnTabSelectedListener() {
   @Override
   publicvoid onTabSelected(TabLayout.Tab tab) {
    toast.setText(tab.getPosition() + ":"+ tab.getText());
    toast.show();
   }
 
   @Override
   publicvoid onTabUnselected(TabLayout.Tab tab) {
 
   }
 
   @Override
   publicvoid onTabReselected(TabLayout.Tab tab) {
 
   }
  });
  setContentView(tabLayout);
 }
}

下面再来看看配合ViewPager的使用方式,实现如下效果图: 

这里写图片描述

布局文件如下:

?

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">
 
 <!--
 app:tabGravity="center" 对齐方式,可选fill和center
 app:tabIndicatorColor="@color/colorAccent" 设置tab下划线的颜色
 app:tabMode="scrollable" scrollable是可以横行滚动,fixed是指固定个数
 app:tabSelectedTextColor="@color/colorPrimaryDark" 选择tab的文本颜色
 app:tabTextColor="@color/colorPrimary" 普通tab字体颜色
 -->
 <android.support.design.widget.TabLayout
  android:id="@+id/tl_tab"
  android:layout_width="match_parent"
  android:layout_height="55dp"
 
app:tabGravity="center"
  app:tabIndicatorColor="@color/colorAccent"
  app:tabMode="scrollable"
  app:tabSelectedTextColor="@color/colorPrimaryDark"
  app:tabTextColor="@color/colorPrimary"
/>
 
 <android.support.v4.view.ViewPager
  android:id="@+id/vp_pager"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/>
</LinearLayout>

代码如下:

?

packageblog.csdn.net.mchenys.tablayoudemo;
 
importandroid.os.Bundle;
importandroid.support.design.widget.TabLayout;
importandroid.support.v4.app.Fragment;
importandroid.support.v4.app.FragmentPagerAdapter;
importandroid.support.v4.view.ViewPager;
importandroid.support.v7.app.AppCompatActivity;
 
/**
 * Created by mChenys on 2016/5/28.
 */
publicclass TabLayoutWithViewPagerActivity extendsAppCompatActivity {
 
 String[] mTitle = newString[20];
 String[] mData = newString[20];
 TabLayout mTabLayout;
 ViewPager mViewPager;
 
 @Override
 protectedvoid onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_tab_view_pager);
  initData();
  initView();
 }
 
 privatevoid initData() {
  for(inti = 0; i < 20; i++) {
   mTitle[i] = "TAB"+ (i + 1);
   mData[i] = "当前选中的是第"+ (i + 1) + "Fragment";
  }
 }
 
 privatevoid initView() {
  mTabLayout = (TabLayout) findViewById(R.id.tl_tab);
  mViewPager = (ViewPager) findViewById(R.id.vp_pager);
  mViewPager.setAdapter(newFragmentPagerAdapter(getSupportFragmentManager()) {
   //此方法用来显示tab上的名字
   @Override
   publicCharSequence getPageTitle(intposition) {
    returnmTitle[position % mTitle.length];
   }
 
   @Override
   publicFragment getItem(intposition) {
    //创建Fragment并返回
    TabFragment fragment = newTabFragment();
    fragment.setTitle(mData[position % mTitle.length]);
    returnfragment;
   }
 
   @Override
   publicint getCount() {
    returnmTitle.length;
   }
  });
  //将ViewPager关联到TabLayout上
  mTabLayout.setupWithViewPager(mViewPager);
 
//  设置监听,注意:如果设置了setOnTabSelectedListener,则setupWithViewPager不会生效
//  因为setupWithViewPager内部也是通过设置该监听来触发ViewPager的切换的.
//  mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
//   @Override
//   public void onTabSelected(TabLayout.Tab tab) {
//   }
//
//   @Override
//   public void onTabUnselected(TabLayout.Tab tab) {
//
//   }
//
//   @Override
//   public void onTabReselected(TabLayout.Tab tab) {
//
//   }
//  });
//  那我们如果真的需要监听tab的点击或者ViewPager的切换,则需要手动配置ViewPager的切换,例如:
  mTabLayout.setOnTabSelectedListener(newTabLayout.OnTabSelectedListener() {
   @Override
   publicvoid onTabSelected(TabLayout.Tab tab) {
    //切换ViewPager
    mViewPager.setCurrentItem(tab.getPosition());
   }
 
   @Override
   publicvoid onTabUnselected(TabLayout.Tab tab) {
 
   }
 
   @Override
   publicvoid onTabReselected(TabLayout.Tab tab) {
 
   }
  });
 }
}

TabFragment 代码如下:

?

packageblog.csdn.net.mchenys.tablayoudemo;
 
importandroid.os.Bundle;
importandroid.support.v4.app.Fragment;
importandroid.util.TypedValue;
importandroid.view.Gravity;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TextView;
 
/**
 * Created by mChenys on 2016/5/28.
 */
publicclass TabFragment extendsFragment {
 privateString mTitle;
 
 publicvoid setTitle(String title) {
  this.mTitle = title;
 }
 
 @Override
 publicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  TextView textView = newTextView(getContext());
  textView.setTextSize(TypedValue.COMPLEX_UNIT_SP,30);
  textView.setGravity(Gravity.CENTER);
  textView.setText(mTitle);
  returntextView;
 }
}

扩展

1.TabLayout除了上面效果图展示的文本以外,从源码中发现它还可以支持Drawable,以及自定义View

?

publicstatic final class Tab {
 
  /**
   * An invalid position for a tab.
   *
   * @see #getPosition()
   */
  publicstatic final int INVALID_POSITION = -1;
 
  privateObject mTag;
  privateDrawable mIcon;
  privateCharSequence mText;
  privateCharSequence mContentDesc;
  privateint mPosition = INVALID_POSITION;
  privateView mCustomView;
 
  privateTabLayout mParent;
  privateTabView mView;
 
  privateTab() {
   // Private constructor
  }

如下效果图,就是通过添加自定义View实现的. 

这里写图片描述

代码如下,只需要修改TabLayout的addTab方法即可:

?

for(inti = 0; i < 20; i++) {
 //1.支持添加字符串文本tab
 //tabLayout.addTab(tabLayout.newTab().setText("TAB" + i));
 
 //2.支持添加图片tab
 //tabLayout.addTab(tabLayout.newTab().setIcon(R.mipmap.ic_launcher));
 
 //3.支持添加View
 View tabView = View.inflate(TabLayoutOnlyActivity.this, R.layout.view_tab, null);
 ((TextView)tabView.findViewById(R.id.tv_title)).setText("TAB"+ i);
 tabLayout.addTab(tabLayout.newTab().setCustomView(tabView));
}

2.替换默认的tab选择效果 

如果你即想使用TabLayout,又想不用它的选中效果,例如我们不想要tab下面的那条下划线作为指示效果.我们应该怎么处理呢?

要替换默认的选中效果,只能通过添加自定义View作为tab了.这样就可以很方便的处理View的选中和未选中状态了. 

同时我们还要隐藏默认的下划线,这个怎么处理呢,这里有个很好的建议.我们可以通过设置下滑线的颜色和tab的背景 颜色一致,这样就看不出来了. 

例如下面我们要实现选中tab的效果是将tab放大1.3倍,没有选中则恢复原来比例.效果图: 

这里写图片描述

修改代码如下:

?

packageblog.csdn.net.mchenys.tablayoudemo;
 
importandroid.graphics.Color;
importandroid.os.Bundle;
importandroid.support.design.widget.TabLayout;
importandroid.support.v7.app.AppCompatActivity;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TextView;
importandroid.widget.Toast;
 
/**
 * Created by mChenys on 2016/5/28.
 */
publicclass TabLayoutOnlyActivity extendsAppCompatActivity {
 intinitPosition; //默认位置
 
 @Override
 protectedvoid onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 //创建TabLayout
 finalTabLayout tabLayout = newTabLayout(this);
 tabLayout.setLayoutParams(newViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100));
 //tab可滚动
 tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
 //tab居中显示
 tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
 //tab的字体选择器,默认黑色,选择时红色
 tabLayout.setTabTextColors(Color.BLACK, Color.RED);
 //tab的下划线颜色,默认是粉红色,如果要自定义选中效果,则可以将下划线设置为和背景色一样.
 tabLayout.setSelectedTabIndicatorColor(Color.WHITE);
 for(inti = 0; i < 20; i++) {
  //1.支持添加字符串文本tab
  //tabLayout.addTab(tabLayout.newTab().setText("TAB" + i));
 
  //2.支持添加图片tab
  //tabLayout.addTab(tabLayout.newTab().setIcon(R.mipmap.ic_launcher));
 
  //3.支持添加View
  View tabView = View.inflate(TabLayoutOnlyActivity.this, R.layout.view_tab, null);
  ((TextView) tabView.findViewById(R.id.tv_title)).setText("TAB"+ i);
  tabLayout.addTab(tabLayout.newTab().setCustomView(tabView));
 }
 
 //设置tab的点击监听器
 tabLayout.setOnTabSelectedListener(newTabLayout.OnTabSelectedListener() {
  @Override
  publicvoid onTabSelected(TabLayout.Tab tab) {
  //将默认位置选中为false
  isSelected(tabLayout.getTabAt(initPosition),false);
  //选中当前位置
  isSelected(tab,true);
 
  }
 
  @Override
  publicvoid onTabUnselected(TabLayout.Tab tab) {
  //tab未选中
  isSelected(tab,false);
  }
 
  @Override
  publicvoid onTabReselected(TabLayout.Tab tab) {
  //tab重新选中
  isSelected(tab,true);
  }
 });
 //进来默认选中位置第3个item
 initPosition = 2;
 isSelected(tabLayout.getTabAt(initPosition),true);
 setContentView(tabLayout);
 }
 
 /**
 * 设置选中的tab是否带缩放效果
 * @param tab
 * @param isSelected
 */
 privatevoid isSelected(TabLayout.Tab tab, booleanisSelected) {
 View view = tab.getCustomView();
 if(null!= view) {
  view.setScaleX(isSelected ? 1.3f : 1.0f);
  view.setScaleY(isSelected ? 1.3f : 1.0f);
 }
 }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yujie0514/article/details/78216483

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签