Android Design Support Library之TabLayout

Google在今年的IO大会上发布了新的support library,用于设计出MD风格的相关的控件。可以兼容android 2.1以上设备。如果使用的Android studio需要在build.gradle文件中添加

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

今天将要介绍其中的TabLayout(android.support.design.widget.TabLayout 选项卡)。
TabLayout 既可以实现固定的选项卡,其每个tab宽度平均分配,也可实现可滚动的选项卡,tab宽度不固定同时可以横向滚动。并且可以方便的ViewPager+fragment结合使用实现 tab之间横向切换,可以直接从PagerAdapter的getPageTitle() 中创建选项卡,然后使用setupWithViewPager()将其联系在一起。它可以使tab的选中事件能更新ViewPager,同时 ViewPager 的页面改变能更新tab的选中状态。如下图:
不固定可以横向滑动的TabLayout
现在先来看看TabLayout有哪一些常用的方法:
addTab(TabLayout.Tab tab, int position, boolean setSelected) 增加选项卡到 layout 中
addTab(TabLayout.Tab tab, boolean setSelected) 同上
addTab(TabLayout.Tab tab) 同上
getTabAt(int index) 得到index选项卡
getTabCount() 得到选项卡的总个数
getTabGravity() 得到 tab 的 Gravity
getTabMode() 得到 tab 的模式
getTabTextColors() 得到 tab 中文本的颜色
newTab() 新建个 tab
removeAllTabs() 移除所有的 tab
removeTab(TabLayout.Tab tab) 移除指定的 tab
removeTabAt(int position) 移除指定位置的 tab
setOnTabSelectedListener(TabLayout.OnTabSelectedListener onTabSelectedListener) 为每个 tab 增加选择监听器,稍候会讲解其回调方法
setScrollPosition(int position, float positionOffset, boolean updateSelectedText) 设置滚动位置
setTabGravity(int gravity) 设置 Gravity(fill填充,center居中)
setTabMode(int mode) 设置 Mode(设置可否滑动,scrollable可滑动)
setTabTextColors(ColorStateList textColor) 设置 tab 中文本的颜色
setTabTextColors(int normalColor, int selectedColor) 设置 tab 中文本的颜色 默认 选中
setTabsFromPagerAdapter(PagerAdapter adapter) 设置 PagerAdapter
setupWithViewPager(ViewPager viewPager) 和 ViewPager 联动

接下来看看其具体使用:
首先在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"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        app:tabSelectedTextColor="@color/title_red"
        app:tabIndicatorColor="@color/title_red"
        app:tabTextColor="@color/black"
        app:tabGravity="fill">
    </android.support.design.widget.TabLayout>
</RelativeLayout>
app:tabIndicatorColor="@color/title_red"

设置选中下滑线颜色,当然还有其他属性可以设置,下去自己可以尝试尝试。
注意记得添加:

xmlns:app="http://schemas.android.com/apk/res-auto"

在java代码中:

public void initTabLayout(){
String[] catesTag={"衣","食","住","行","用","玩","学"};
        if(lists==null){
            return;
        }
        for (int i=0;lists.size()>i;i++){
            if(i==0){
            //初始化创建tabs。true表示默认选中该tab
    mTabLayout.addTab(prosClasses.newTab().setText(catesTag[0]),true);
            }else {
            //false默认不选中
    mTabLayout.addTab(prosClasses.newTab().setText(catesTag[i]),false);
            }
        }
        //设置TabLayout模式可以用
        //mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
        //默认是不可滑动的
    }   

这样就可以显示出来了。还是比较简单的。

固定不可滑动的TabLayout
接下来就要给TabLayout设置监听:

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:

<?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"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        app:tabSelectedTextColor="@color/title_red"
        app:tabIndicatorColor="@color/title_red"
        app:tabTextColor="@color/black"
        app:tabGravity="fill">
    </android.support.design.widget.TabLayout>
    <android.support.v4.view.ViewPager
  android:id="@+id/vp"
   android:layout_below="@+id/tabs"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />
</RelativeLayout>

需要将Viewpager和TabLayout关联起来:

mTabLayout = (TabLayout) findViewById(R.id.tablayout);
mTabLayout.setTabTextColors(Color.Red, Color.Black);//设置文本在选中和为选中时候的颜色
    vp = (ViewPager) findViewById(R.id.vp);
   TabFragmentPagerAdapter adapter=new TabFragmentPagerAdapter(
                getSupportFragmentManager(),fragments,titles);
        mViewPager.setAdapter(adapter);
        mTabLayout.setupWithViewPager(mViewPager);
        mTabLayout.setTabsFromPagerAdapter(adapter);

其中fragments是fragment的集合,titles是需要显示的title。这样就将Viewpager和Fragment结合起来了。可以实现联动。
TabFragmentPagerAdapter代码如下:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;

import java.util.List;

public class TabFragmentPagerAdapter extends FragmentStatePagerAdapter{
    private List<Fragment>fragments;
    private List<String>titles;
    public TabFragmentPagerAdapter(FragmentManager fm,List<Fragment> fragments, List<String> titles) {
        super(fm);
        this.fragments=fragments;
        this.titles=titles;
    }
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return titles.get(position);
    }
}

TabLayout用起来还是比较容易的,虽然类似的效果可以用其他方式实现,但是毕竟是Google官方的库,还是了解一下。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值