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

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签