Android 项目常用滑动页卡模式ViewPager+MagicIndicator(三)

TabLayout设置切换水平布局展示Tabs,大家也许会想到各种第三方的,如:XTabLayout,还可以直接使用Button等控件来实现效果,那这里就简单的介绍并总结一下TabLayout的一些用法:

1.先看看布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main_content"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:orientation="vertical"tools:context=".view.largeamount.view.ApplyHistoryActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/colorWhite"android:orientation="horizontal"><TextViewandroid:id="@+id/backButton"android:layout_width="50dp"android:layout_height="match_parent"android:drawableStart="@mipmap/common_nav_icon_back"android:paddingStart="15dp"/><android.support.design.widget.TabLayoutandroid:id="@+id/tabLayout"app:tabIndicatorColor="@color/blue_one"android:layout_width="match_parent"app:tabIndicatorHeight="3dp"android:layout_height="wrap_content"><android.support.design.widget.TabItemandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/text_coin_subtitle"/><android.support.design.widget.TabItemandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/menu_borrowing_money"/></android.support.design.widget.TabLayout></LinearLayout><android.support.v4.view.ViewPagerandroid:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout>

使用TabLayout,要让Activity继承自AppCompatActivity,但有时候你项目里的BaseActivity却是继承自FragmentActivity的,AppCompatActivity 也是extends FragmentActivity的。可以把BaseActivity extends AppCompatActivity。如果不想这么做也可以,可以指定当前Activity的theme为:

android:theme="@style/Theme.AppCompat"

然后build.gradle文件在dependencies里加上

compile 'com.android.support:design:25.0.0'

TabLayout的一些基本属性:

app:tabIndicatorColor :指示条的颜色
app:tabIndicatorHeight :指示条的高度
app:tabSelectedTextColor : tab被选中时的字体颜色
app:tabTextColor : tab未被选中时的字体颜色
app:tabMode="scrollable" : 默认是fixed:固定的,标签很多时候会被挤压,不能滑动。

若是不需要指示器显示的话可以加上下面的代码:

高度设置为0:

app:tabIndicatorHeight="0dp"

还可以设置成透明色:

app:tabIndicatorColor="@color/transparent"

2.TabItem的一些常识:

设置其字体的大小:

app:tabTextAppearance="@android:style/TextAppearance.Holo.Large"
<style name="TextAppearance.Holo.Large" parent="TextAppearance.Large" />
<style name="TextAppearance.Holo.Medium"parent="TextAppearance.Medium"/>
<style name="TextAppearance.Holo.Small" parent="TextAppearance.Small" />

3.添加图标:

Tab是使用adapter中的getPageTitle()方法做其显示的内容,这个方法返回类型为CharSequence。于是,我们可以在PagerAdapter中重写getPageTitle()方法,创建一个SpannableString,而将图标放置在ImageSpan中,设置在SpannableString中:

public class ImageTabActivity extends AppCompatActivity {ViewPager mViewPager;ListFragment mFragment1;ListFragment mFragment2;ListFragment mFragment3;PagerAdapter mPagerAdapter;private TabLayout mTabLayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.image_tab_layout);initView(savedInstanceState);}private void initView(Bundle savedInstanceState) {mViewPager = (ViewPager) findViewById(R.id.view_pager);mViewPager.setOffscreenPageLimit(2);mTabLayout = (TabLayout) findViewById(R.id.toolbar_tab);if (savedInstanceState == null) {mFragment1 = new ListFragment();mFragment1.initData('a', 'z');mFragment2 = new ListFragment();mFragment2.initData('A', 'Z');mFragment3 = new ListFragment();mFragment3.initData('c', 'x');}mPagerAdapter = new PagerAdapter(getSupportFragmentManager());mViewPager.setAdapter(mPagerAdapter);mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));mTabLayout.setupWithViewPager(mViewPager);mTabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));}private int[] imageResId = {R.mipmap.login_qq,R.mipmap.login_sina,R.mipmap.login_wechat};public class PagerAdapter extends FragmentPagerAdapter {public PagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic CharSequence getPageTitle(int position){Drawable image = ContextCompat.getDrawable(ImageTabActivity.this, imageResId[position]);image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight());SpannableString sb = new SpannableString(" ");ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM);sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);return sb;}@Overridepublic Fragment getItem(int position) {if (position == 0) {return mFragment1;} else if (position == 1) {return mFragment2;}else if (position == 2) {return mFragment3;}return null;}@Overridepublic int getCount() {return 3;}}
}
public class CustomTabItemActivity extends AppCompatActivity {ViewPager mViewPager;ListFragment mFragment1;ListFragment mFragment2;PagerAdapter mPagerAdapter;private TabLayout mTabLayout;private ArrayList<String> titles = new ArrayList<>();private boolean isSelected = false;private int[] tabIcons = {R.mipmap.icon_down,R.mipmap.icon_down,};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.custom_tabitem_layout);initView(savedInstanceState);}private void initView(Bundle savedInstanceState) {mViewPager = (ViewPager) findViewById(R.id.view_pager);mViewPager.setOffscreenPageLimit(2);mTabLayout = (TabLayout) findViewById(R.id.toolbar_tab);if (savedInstanceState == null) {mFragment1 = new ListFragment();mFragment1.initData('a', 'z');mFragment2 = new ListFragment();mFragment2.initData('A', 'Z');}titles.add("最新");titles.add("最热");mPagerAdapter = new PagerAdapter(getSupportFragmentManager());mViewPager.setAdapter(mPagerAdapter);mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));mTabLayout.setupWithViewPager(mViewPager);mTabLayout.getTabAt(0).setCustomView(getTabView(0));mTabLayout.getTabAt(1).setCustomView(getTabView(1));mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {@Overridepublic void onTabSelected(TabLayout.Tab tab) {changeTabStatus(tab, true);}@Overridepublic void onTabUnselected(TabLayout.Tab tab) {changeTabStatus(tab, false);}@Overridepublic void onTabReselected(TabLayout.Tab tab) {}});}private void changeTabStatus(TabLayout.Tab tab, boolean selected) {View view = tab.getCustomView();final ImageView imgTitle = (ImageView) view.findViewById(R.id.img_title);TextView txtTitle = (TextView) view.findViewById(R.id.txt_title);imgTitle.setVisibility(View.VISIBLE);if (selected) {txtTitle.setTextColor(Color.parseColor("#0EA73C"));startPropertyAnim(imgTitle);} else {txtTitle.setTextColor(Color.parseColor("#7f7f7f"));imgTitle.setVisibility(View.INVISIBLE);}}public View getTabView(final int position) {final View view = LayoutInflater.from(this).inflate(R.layout.item_tab, null);TextView txtTitle = (TextView) view.findViewById(R.id.txt_title);final ImageView imgTitle = (ImageView) view.findViewById(R.id.img_title);imgTitle.setImageResource(tabIcons[position]);txtTitle.setText(titles.get(position));if (position == 0) {txtTitle.setTextColor(Color.parseColor("#057523"));} else {imgTitle.setVisibility(View.INVISIBLE);txtTitle.setTextColor(Color.parseColor("#ced0d3"));}view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startPropertyAnim(imgTitle);mViewPager.setCurrentItem(position);}});return view;}private void startPropertyAnim(ImageView v) {ObjectAnimator anim = ObjectAnimator.ofFloat(v, "rotation", 180f, 360f);anim.setDuration(500);anim.start();}public class PagerAdapter extends FragmentPagerAdapter {public PagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic Fragment getItem(int position) {if (position == 0) {return mFragment1;} else if (position == 1) {return mFragment2;}return null;}@Overridepublic int getCount() {return 2;}}
}

4.TabLayout的指示器的高度、颜色都可以设置,下面来设置一下宽度:

/*** @desc:  设置tablayout的指示器的宽度*/
private void initView() {mTabLayout.post(new Runnable() {@Overridepublic void run() {setIndicator(mTabLayout, 40, 40);}});
}
/*** @desc:  设置tab指示器的宽度*/
public void setIndicator(TabLayout tabs, int leftDip, int rightDip) {Class<?> tabLayout = tabs.getClass();Field tabStrip = null;try {tabStrip = tabLayout.getDeclaredField("mTabStrip");} catch (NoSuchFieldException e) {e.printStackTrace();}tabStrip.setAccessible(true);LinearLayout llTab = null;try {llTab = (LinearLayout) tabStrip.get(tabs);} catch (IllegalAccessException e) {e.printStackTrace();}int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());for (int i = 0; i < llTab.getChildCount(); i++) {View child = llTab.getChildAt(i);child.setPadding(0, 0, 0, 0);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);params.leftMargin = left;params.rightMargin = right;child.setLayoutParams(params);child.invalidate();}
}

TabLayout的基本用法(一)相关推荐

  1. android tablayout 自定义,TabLayout用法详解及自定义样式

    TabLayout的默认样式: app:theme="@style/Widget.Design.TabLayout" 从系统定义的该样式继续深入: fill fixed 264dp ...

  2. TabLayout——浅谈

    TabLayout--浅谈 TabLayout是Google新推出(其实好久了...)的一个组件,在android5.0的之后的应用中被广泛应用,最近做的一个项目当中也使用到,所以抽空花点时间,整理总 ...

  3. Android TabLayout基本使用及完美调整指示器位置的技巧

    在应用中,我们经常遇到多个页签切换的需求,这个时候往往使用viewPager+TabLayout实现,但官方的TabLayout使用时往往不满足我们的需求,例如不能修改指示器长度的问题,本文利用巧妙的 ...

  4. AndroidX TabLayout使用、扩展及解析All In One,跪了

    首先,讲讲为什么我们要讲JAVA的语言进阶,从整体来讲,Java和Android的区别在于Android程序是基于组件和配置的,而且Android开发以Java语言为开发工具,表面上看他们有点同宗不同 ...

  5. TabLayout使用指南

    TabLayout是开发中经常使用到的控件,经常与ViewPager一起配合使用,一组tab,可以点击.可以滚动.这不,我们的app中也是用到了这个控件,之前对这个控件只停留在最基本的用法,因此开发时 ...

  6. Tablayout-布局标签

    文章目录 先用起来 属性 常用属性 设置文字和图片 设置布局模式 设置边距.宽度等 设置指示器 设置水波纹的属性 使用style设置tablayout样式 设置监听 与ViewPager关联 setC ...

  7. Android TabLayout(选项卡布局)简单用法实例分析

    本文实例讲述了Android TabLayout(选项卡布局)简单用法.分享给大家供大家参考,具体如下: 我们在应用viewpager的时候,经常会使用TabPageIndicator来与其配合.达到 ...

  8. android design library提供的TabLayout的用法

    在开发中,我们常常需要ViewPager结合Fragment一起使用,如下图: 1 我们可以使用三方开源的PagerSlidingTabStrip去实现,或者viewpagerindicator,我一 ...

  9. TabLayout的用法进行总结和归纳

    Google官方在14年Google I/O上推出了全新的设计语言--Material Design.一并推出了一系列实现Material Design效果的控件库--Android Design S ...

最新文章

  1. Python编程语言学习:sklearn.manifold的TSNE函数的简介、使用方法、代码实现之详细攻略
  2. java中转json字符串_如何在Java中转义JSON字符串-Eclipse IDE技巧
  3. nat 网卡间数据包转发_nat端口转发示例
  4. c 语言读取注册表信息,C++读取注册表的实现方法
  5. 瑞欧威尔联合创始人兼CEO 李波博士:“工业元宇宙”是为了更好赋能实体经济
  6. JQuery AJAX基本使用
  7. 手写一个RPC框架,理解更透彻(附源码)
  8. Tomcat URL重写
  9. linux下载镜像的命令wget,Linux wget命令整站下载做网站镜像
  10. TimePickerDialog -下划线颜色修改
  11. php找零页面,找零问题
  12. 基于微信小程序的校友录系统毕业设计源码
  13. Arduino火焰传感器(含代码)
  14. 使用PyQt5为YoloV5添加界面(一)
  15. c语言信封大小,A1、B1、C1的国际标准纸张的大小尺寸各是多少啊?
  16. Python模块configparser:加载配置文件config.ini
  17. 第六章第十三题(数列求和)(Sum series)
  18. Java图书管理系统,java课程实习
  19. 基于STM32的ESP8266获取天气数据(HAL库)
  20. java serialport_java SerialPort串口通讯的使用

热门文章

  1. 用php怎么改文件名
  2. 新的换脸模型FaceShifter论文解读
  3. vue 根据不同分辨率设置css
  4. 智慧园区是未来发展的趋势吗?
  5. 注意!青年失业率高达21.3%,而这个Android 岗位需求却不降反升!!
  6. linux arp攻击解决方法 测试很有效
  7. 全球首个可以实时互动的偶像团体,蜜枝科技能否打造出中国版“迪士尼”?丨Xtecher 观察
  8. Scala语言开发环境的部署
  9. MBSE和SysML
  10. C#读写Excel的几种方法