TabLayout 与 ViewPager 的联合使用

   2016-11-10 0
核心提示:TabLayout是Google官方的design-support jar包中的一个组件。 如图所示: 但是TabLayout有一个致命的缺点,那就是没办法进行滑动切换,只能通过点击切换。为了弥补这个缺点,google提供了一个方法可以将TabLayout与ViewPager结合在一起,实现滑动切换的效果。

TabLayout是Google官方的design-support jar包中的一个组件。

如图所示:

 TabLayout 与 ViewPager 的联合使用

但是TabLayout有一个致命的缺点,那就是没办法进行滑动切换,只能通过点击切换。为了弥补这个缺点,google提供了一个方法可以将TabLayout与ViewPager结合在一起,实现滑动切换的效果。

TabLayout的一些属性

  • tabMaxWidth: tab tiem的最大宽度,当app:tabMode=”fixed”时不起作用
  • tabIndicatorColor: TabLayout指示器的颜色
  • tabIndicatorHeight: TabLayout指示器的高度
  • tabPaddingStart: 距离开始的长度
  • tabPaddingEnd: 距离结束的长度
  • tabBackground: 背景
  • tabTextAppearance: TableLayout title字体属性
  • tabSelectedTextColor: 当前选择的字体的tab的字体颜色

如何使用

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activities.MainActivity">

    <android.support.design.widget.TabLayout
        android:id="@+id/tablayout"
        android:layout_width="match_parent"
        android:layout_height="?android:actionBarSize"
        android:background="@color/primary"
        app:tabMode="fixed"
        app:tabSelectedTextColor="@color/accent" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/tablayout" />

</RelativeLayout>

适配器

public class VPAndTLAdapter extends FragmentStatePagerAdapter {

    private List<String> tabNames;
    private List<BaseFragment> fragments;

    public VPAndTLAdapter(FragmentManager fm, List<String> tabNames, List<BaseFragment> fragments) {
        super(fm);
        this.tabNames = tabNames;
        this.fragments = fragments;
    }
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }
    @Override
    public int getCount() {
        return fragments.size();
    }
    /**
    *这个函数就是给TabLayout的Tab设定Title
    */
    @Override
    public CharSequence getPageTitle(int position) {
        return tabNames.get(position);
    }
}

Fragment

TabLayout的每一个Tab就对应着与一个Fragment

public class GraphFragment extends Fragment {

    private static final String TAG = "GraphFragment";
    private View rootView;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_graph, container, false);
        return rootView;
    }
    @Override
    public void on
Start() {
        super.on
Start();
    }
}

MainActivity

private static final String TAB_NAME_1 = "流量图像";
private static final String TAB_NAME_2 = "监控视频";
private static final String TAB_NAME_3 = "个人中心";
private List<String> tabNames;
private List<BaseFragment> fragments;

private void initTablayoutAndViewPager() {
        tabNames = new ArrayList<>();
        fragments = new ArrayList<>();
        tabNames.add(TAB_NAME_1);
        tabNames.add(TAB_NAME_2);
        tabNames.add(TAB_NAME_3);

        mVideoFragment = new VideoFragment();
        mPersonFragment = new PersonFragment();
        mGraphFragment = new GraphFragment();
        fragments.add(mGraphFragment);
        fragments.add(mVideoFragment);
        fragments.add(mPersonFragment);

        VPAndTLAdapter mVpAndTLAdapter = new VPAndTLAdapter(getSupportFragmentManager(), tabNames, fragments);
        mViewPager.setAdapter(mVpAndTLAdapter);
        mTabLayout.setupWithViewPager(mViewPager);
    }

这样就可以实现滑动切换tab的效果啦。

缺陷&尝试

虽然基本上实现了滑动Tab的效果,但是有一个缺点,那就是无法为Tab设置图标。

之前我尝试过这样添加图标,但是失败了:

for (String tabName : tabNames) {
    mTabLayout.addTab(mTabLayout.newTab().setIcon(getResources().getDrawable(R.mipmap.ic_launcher)));
}

这种方法失败的原因是:之前设置的tab被适配器类中getPageTitle()覆盖了,所以无法显示图片。

SpannableString介绍

想要在Tab上显示图片就要用到这个类。

首先,SpannableString这个类实现了CharSequence这个接口,所以可以在Adapter中的getPageTitle()中返回。

那么,SpannableString这个类的作用到底有哪些呢?最简单的来说,它可以实现在字符串中插入一些别的东西,例如表情,颜色,甚至是HTML中的某些标签。例如:QQ的对话View(应该是这样实现的)

构造方法

SpannableString的构造方法需要一个参数:CharSequence(没错就是这个超级字符串的基本显示内容)

public SpannableString(CharSequence source) {
    super(source, 0, source.length());
}

setSpan()方法

setSpan()就是这个类的核心内容了,源码如下:

public void setSpan(Object what, int start, int end, int flags) {
    super.setSpan(what, start, end, flags);
}

参数:

  • 第一个参数为要向这个超级字符串中添加的内容。例如:前景色、背景色、图片、链接、下划线等等,稍后为大家展示
  • 第二个参数为开始的位置(0为开始)
  • 第三个参数为结束的位置
  • 最后一个参数用来标识在span范围内的文本前后输入新的字符时是否也应用这个效果,分别有:
    • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)
    • Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)
    • Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)
    • Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)

例子

添加前景色

spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

添加背景色

spannableString.setSpan(new BackgroundColorSpan(Color.RED), 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

添加下划线

spannableString.setSpan(new UnderlineSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

添加图片

spannableString.setSpan(new ImageSpan(mContext, R.id.ic_launcher, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

….

开始改造

首先要修改Adapter的构造方法

Adapter

private List<String> tabNames;
private List<BaseFragment> fragments;
private List<Integer> tabIcs;
private SpannableString spannableString;
private Context mContext;

public VPAndTLAdapter(FragmentManager fm, Context mContext, List<String> tabNames, List<BaseFragment> fragments, List<Integer> tabIcs) {
    super(fm);
    this.mContext = mContext; //获取图片资源的时候需要Context参数
    this.fragments = fragments;
    this.tabNames = tabNames; //每个Tab上的文字、可以为null
    this.tabIcs = tabIcs; //每个Tab上的图标,可以为null
}

接着就是修改getPageTitle()这个方法:

@Override
public CharSequence getPageTitle(int position) {
    if (tabNames == null) {     //不设置文字
        spannableString = new SpannableString(" ");  //这里要给图片留一个字符的空间。
    } else {
        spannableString = new SpannableString(" " + tabNames.get(position));
    }
    if (tabIcs != null) {    //设置图标
        spannableString.setSpan(new ImageSpan(mContext, tabIcs.get(position)), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    return spannableString;
}

设置TabLayout的属性

不得不说,这个问题耗了我好长时间:(

首先在styles.xml文件内定义这样一个样式:

<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
      <item name="textAllCaps">false</item>
      <item name="android:textAllCaps">false</item>
      <!-- 注意这两个属性一定要写,缺一不可,否则显示不出图片! -->
</style>

接着设置TabLayout的属性:

app:tabTextAppearance="@style/MyCustomTextAppearance"
 
标签: ViewPager
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Android Fragment+ViewPager 组合,一些你不可不知的注意事项
    Android Fragment+ViewPager 组合,一些你不可
    前面两篇文章中,对 Fragment 的基本使用、常见问题和状态恢复做了详细的分析总结。除了在 Activity 中单独使用 Fragment,Fragment + ViewPager 组合也是项目中使用非常频繁的方式,本文再来总结一下这种组合使用时的注意事项。在此之前,如果你对 Fragment
    12-23 ViewPager
  • ViewPager实现轮播广告图
    ViewPager实现轮播广告图
    轮播广告在现在的应用中比较常见,下面就来实现下该功能(文章参考了网上流传的黑马的视频教程)先来看下具体的实现效果:实现思路:1.为ViewPager设置数据源,实现ViewPager的滚动2.将圆点指示器与ViewPager的页面对应起来3.实现左右滑动均能无限循环4.实现自
    12-01 ViewPager
  • wemall doraemon中Android app商城系统解决左侧抽屉菜单和viewpager不能兼容问题
    wemall doraemon中Android app商城系统解决左侧
    完美解决左侧抽屉菜单和viewpager不能兼容左右滑动的问题,可进行参考。 WeMall-Client/res/layout/wemall_main_ui.xml /RadioGroup/RelativeLayout/cn.edu.zzu.wemall.ui.SlideMenu/RelativeLayout\ No newline at end of file WeMall-Client/src/cn/edu/zzu
    11-10 ViewPager
  • ViewPager 获取当前显示的Fragment
    使用getSupportFragmentManager().findFragmentByTag()方法Viewpager + FragmentPagerAdapter情况下 才好使;FragmentPagerAdapter有一个特点 凡是加载过的Fragment 都会被保留,既然Fragment不会被销毁,那我们就可以使用findFragmentByTag()方法找到它;但问
    11-07 ViewPager
  • 巧用ViewPager 打造不一样的广告轮播切换效果
    巧用ViewPager 打造不一样的广告轮播切换效果
    一、概述 推送了一篇文章,文章名为 Android超高仿QQ附近的人搜索展示(一) ,通过该文可以利用ViewPager实现单页显示多个Item且能够添加一些炫酷的动画效果。我当时阅读这篇文章的时候,简单做了下记录,然后想了想,可以按照该思路做一个比较特殊轮播效果
    11-03 ViewPager
  • 给 viewpager 加上切换动画
    给 viewpager 加上切换动画
    ViewPagerTransformsInculde Gradlecompile 'com.simplepeng.library:transformslibrary:1.0.0' MavendependencygroupIdcom.simplepeng.library/groupIdartifactIdtransformslibrary/artifactIdversion1.0.0/versiontypepom/type/dependencyuseageTransformUt
    08-30 ViewPager
  • Android编程实现ViewPager多页面滑动切换及动画效果的方法
    Android编程实现ViewPager多页面滑动切换及动画
    这篇文章主要介绍了Android编程实现ViewPager多页面滑动切换及动画效果的方法,以完整实例形式分析了ViewPager多页面滑动切换效果的布局及功能实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 使用ViewPager实现左右循环滑动及滑动跳转
    使用ViewPager实现左右循环滑动及滑动跳转
    今天实现了左右滑动,至于在最后一页滑动跳转,这个也做了但是效果不是太好,也希望有实现的朋友能够分享下
  • 使用ViewPager实现高仿launcher左右拖动效果
    使用ViewPager实现高仿launcher左右拖动效果
    今天用ViewPager这个类实现了同样的左右拖动效果,这样代码更少,但是效果是一样的,ViewPager是实现左右两个屏幕平滑地切换的一个类,它是Google提供的,有需要的朋友可以了解下
  • 自定义RadioButton和ViewPager实现TabHost带滑动的页卡效果
    自定义RadioButton和ViewPager实现TabHost带滑
    在工作中又很多需求都不是android系统自带的控件可以达到效果的所以这个时候就要自定义控件来达到效果:使用自定义RadioButton和ViewPager实现TabHost带滑动的页卡效果
点击排行