Material Design控件使用总结之TabLayout

此文同步CSDN:Material Design控件使用总结之TabLayout

一、TabLayout使用前提

    compile 'com.android.support:design:26.+'

首先要导入依赖,需要注意的是版本一定要和自己support库的版本一致,

二、使用过程

一)基本使用

布局文件:

  <android.support.design.widget.TabLayout
        android:id="@+id/main_tab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabBackground="@android:color/white"
        app:tabIndicatorColor="@color/colorAccent"
        app:tabSelectedTextColor="@color/colorAccent"
        app:tabTextColor="@android:color/black" />

    <android.support.v4.view.ViewPager
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

这个需要解释的就是相关的属性,具体的可以查看官方文档,这里介绍几个常用的

app:tabIndicatorColor—–>tablayout下划线的颜色

app:tabIndicatorHeight—–>tablayout下划线的高度,如果不想显示可设置为0

app:tabTextColor—–>文本颜色

app:tabSelectedTextColor—–>选中后文本颜色

app:tabGravity—–>显示的位置 值有center 和fill

app:tabTextAppearance—–>设置显示字体的大小

app:tabMode —–>tab的显示方式,fixed填充屏幕如果内容过多会挤掉内容,scrollable内容过多,则可以滑动,内容少,则从左向右排列,不会填充屏幕

接下来,重要的就是给对应的tab设置不同的viewpager页面内容了,每一个ViewPager的内容都设置为一个Fragment

public class ContentFragment1 extends Fragment {

    public static ContentFragment1 newInstance(int page) {
        ContentFragment1 pageFragment = new ContentFragment1();
        return pageFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_content2, container, false);
        return view;
    }

}

创建ViewPager的适配器, 这里提供了一个公共方法addData()来为viewpager设置数据,也可直接在adapter中设置数据,或者通过构造方法把数据传递过来。当然,也可以把adapter设置为一个内部类

class TabViewPagerAdapter extends FragmentStatePagerAdapter {

    private List<String> titles;
    private List<Fragment> fragments;

    public TabViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

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

    public void addData(List<String> tabList,List<Fragment> fragmentList){
        this.titles = tabList;
        this.fragments = fragmentList;
    }
//返回Tab的标题,必须重写该方法,否则不显示tab标题
    @Override
    public CharSequence getPageTitle(int position) {
        if (titles != null){
            return titles.get(position);
        }
        return super.getPageTitle(position);
    }
}

最后在activity中,对数据进行初始化就可以了

public class MainActivity extends AppCompatActivity {

    private TabLayout mainTab;
    private ViewPager mainContent;

    private List<String> tabList;
    private List<Fragment> fragmentList;
    private TabViewPagerAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        initData();

        adapter = new TabViewPagerAdapter(getSupportFragmentManager());
        // 设置tablayout数据
        adapter.addData(tabList,fragmentList);
        mainContent.setAdapter(adapter);
        //设置Tablayout与ViewPager的联动
        mainTab.setupWithViewPager(mainContent);
    }

    private void initData() {
        tabList = new ArrayList<>();
        tabList.add("推荐");
        tabList.add("关注");
        tabList.add("热门");

        fragmentList = new ArrayList<>();
        fragmentList.add(new ContentFragment1());
        fragmentList.add(new ContentFragment2());
        fragmentList.add(new ContentFragment3());
    }

    public void initView() {
        mainTab = (TabLayout) findViewById(R.id.main_tab);
        mainContent = (ViewPager) findViewById(R.id.main_content);
    }
}

至此,已经基本的用法已经了解了,效果图:

tablayout基本使用.png

当然这里用的都是默认属性,为了方便颜色也用的android自带的,可根据自己的需要设置属性即可。同时可以指定下划线的高度,如果不想显示下划线,可将tabIndicatorColor设置为透明或者设置tabIndicatorHeight为0

二)进阶

1)改变TabLayout的文本的大小

当你修改文本大小时会发现没有textSize这个属性,也就是说无法修改文本大小,但是发现app:tabTextAppearance这个属性,可以修改文本的样式,于是乎,我们就可以通过这个属性间接修改文本大小

在style中:

 <style name="TabTextSize"  parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
        <item name="android:textSize">18sp</item>
    </style>
2)为TabLayout显示图片

效果图:

278362072502111057.jpg

TabLayout并没有设置图片相关的属性,可以通过TabLyout.Tab对象的setIcon()方法设置,我在搜索过程中发现,很多使用SpannableString来设置图片,如果需要图片有选中和未选中两种状态,则需要对当前Tab是否被点击做个判断,然后传给adapter的getPageTitle()方法来处理。此处我用两个数组存放两种状态的图片,为tablayout设置监听addOnTabSelectedListener来进行切换。

 /**
     * 为Tab设置文字和图片
     */
    private void setTabIcon() {
        if (tabList == null || tabList.size() == 0){
            return;
        }

        for (int i = 0; i < tabList.size(); i++){
            //依次获取标签
            TabLayout.Tab tab = mainTab.getTabAt(i);
            //为标签设置图标和文字
            tab.setIcon(tabIcon[i]);

            // 默认选中第一项
            if (i == 0 ){
                tab.setIcon(tabSelectedIcon[0]);
            }
        }

        mainTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                tab.setIcon(tabSelectedIcon[tab.getPosition()]);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                tab.setIcon(tabIcon[tab.getPosition()]);

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }
3)在TabLayout上显示自定义view

效果如下图所示,添加另一个增大的效果


269405666955536014.jpg

实现过程和图片文字的类似,这里通过setCustomView为tab设置自定义view视图,

  holder = null;
        for (int i = 0; i < tabList.size(); i++) {
            //依次获取标签
            TabLayout.Tab tab = mainTab.getTabAt(i);
            //为每个标签设置布局
            tab.setCustomView(R.layout.custom_tab);
            holder = new ViewHolder(tab.getCustomView());
            //为标签填充数据
            holder.ivTabIcon.setImageResource(tabIcon[i]);
            holder.tvTabText.setText(tabList.get(i));
            holder.tvTabText.setTextColor(getResources().getColor(R.color.c_535151));

            //默认选择第一项
            if (i == 0){
                holder.ivTabIcon.setSelected(true);
                holder.tvTabText.setSelected(true);
                holder.ivTabIcon.setImageResource(R.drawable.selected_guanzhu);
                holder.tvTabText.setTextSize(16);
                holder.tvTabText.setTextColor(getResources().getColor(R.color.c_406af2));
            }
        }

        //tab选中的监听事件
        mainTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                holder = new ViewHolder(tab.getCustomView());
                holder.ivTabIcon.setSelected(true);
                holder.tvTabText.setSelected(true);
                //选中后字体变大
                holder.tvTabText.setTextSize(16);
                holder.tvTabText.setTextColor(getResources().getColor(R.color.c_406af2));
                //选中后图片变大 变色
                holder.ivTabIcon.setImageResource(tabSelectedIcon[tab.getPosition()]);
                //让Viewpager跟随TabLayout的标签切换
                mainContent.setCurrentItem(tab.getPosition());

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                holder = new ViewHolder(tab.getCustomView());
                holder.ivTabIcon.setSelected(false);
                holder.tvTabText.setSelected(false);
                //恢复为默认字体大小
                holder.ivTabIcon.setImageResource(tabIcon[tab.getPosition()]);
                holder.tvTabText.setTextSize(12);
                holder.tvTabText.setTextColor(getResources().getColor(R.color.c_535151));

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
         }

    class ViewHolder{
        ImageView ivTabIcon;
        TextView tvTabText;

        public ViewHolder(View tabView) {
            ivTabIcon =  tabView.findViewById(R.id.custom_tab_image);
            tvTabText = tabView.findViewById(R.id.custom_tab_text);
        }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,333评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,812评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,016评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,293评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,650评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,788评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,003评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,741评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,462评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,681评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,168评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,528评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,169评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,119评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,846评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,719评论 2 274

推荐阅读更多精彩内容