使用TabLayout遇到的几个坑

1.setupWithViewPager以后之前已经设置好的tab的视图消失了

看源码: setupWithViewPager里面有这段

            final PagerAdapter adapter = viewPager.getAdapter();
            if (adapter != null) {
                // Now we'll populate ourselves from the pager adapter, adding an observer if
                // autoRefresh is enabled
                setPagerAdapter(adapter, autoRefresh);
            }

setPagerAdapter里面有populateFromPagerAdapter

    void populateFromPagerAdapter() {
        removeAllTabs();
        ......
    }

看到了么,会把之前所有设置的TABS清空。那么解决方案就很简单。先关联,在设置

2.tabLayout切换时文字颜色当未选中时没有恢复

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                int i = tabLayout.getSelectedTabPosition();
                Log.e("onTabSelected", i + "");
                tab.setIcon(licons_p[i]);
                mViewPager.setCurrentItem(i);
                //tabLayout.setTabTextColors(Color.BLACK, Color.RED);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                int i = tabLayout.getSelectedTabPosition();
                Log.e("onTabUnselected", i + "");
                tab.setIcon(licons[i]);
                //tabLayout.setTabTextColors(Color.BLACK, Color.BLACK);
            }

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

            }
        });

(先不看注释部分)我们一般都按照上面的写,但是文字颜色在切换的时候会有问题。 当我们先点击Tab1,再点击Tab2的时候(仅计算Tab2的步骤)。会先调用onTabUnselected,然后调用onTabSelected。基于这样的调用,我们可以在onTabUnselected里面先恢复到默认的颜色,然后再在onTabSelected设置点击的颜色

最后附上我的代码

public class MainActivity extends AppCompatActivity {

    private TabLayout tabLayout;
    private ViewPager mViewPager;
    private List<String> mTitleList = new ArrayList<>();//页卡标题集合
    private List<Fragment> mFragmentList = new ArrayList<>();
    //未选中状态的icon数组
    int licons[] = {R.drawable.custom, R.drawable.stock, R.drawable.order};
    //选中状态下的icon数组
    int licons_p[] = {R.drawable.custom_p, R.drawable.stock_p, R.drawable.order_p};

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

        mTitleList.add("商户");
        mTitleList.add("名字");
        mTitleList.add("出售");

        mFragmentList.add(new AFragment());
        mFragmentList.add(new BFragment());
        mFragmentList.add(new CFragment());

        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        tabLayout = (TabLayout) findViewById(R.id.tabLayout);

        MyAdpter mAdapter = new MyAdpter(getSupportFragmentManager(), mFragmentList);
        mViewPager.setAdapter(mAdapter);
        mViewPager.setOffscreenPageLimit(3);
        mViewPager.setCurrentItem(0);

        forIconAndText();
    }

    /**
     * 文字图片都有的情况
     */
    private void forIconAndText() {
        tabLayout.setupWithViewPager(mViewPager);//将TabLayout和ViewPager关联起来。

        //setupWithViewPager里面有removeAllTabs,所以关联以后在添加
        tabLayout.removeAllTabs();
        for (int i = 0; i < mTitleList.size(); i++) {
            tabLayout.addTab(tabLayout.newTab().setIcon(licons[i]).setText(mTitleList.get(i)));
        }

        tabLayout.getTabAt(0).setIcon(licons_p[0]);
        tabLayout.setTabTextColors(Color.BLACK, Color.RED);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                int i = tabLayout.getSelectedTabPosition();
                Log.e("onTabSelected", i + "");
                tab.setIcon(licons_p[i]);
                mViewPager.setCurrentItem(i);
                tabLayout.setTabTextColors(Color.BLACK, Color.RED);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                int i = tabLayout.getSelectedTabPosition();
                Log.e("onTabUnselected", i + "");
                tab.setIcon(licons[i]);
                tabLayout.setTabTextColors(Color.BLACK, Color.BLACK);
            }

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

            }
        });
    }

    /**
     * 只有文字的情况
     */
    private void onlyForText() {
        tabLayout.removeAllTabs();
        for (int i = 0; i < mTitleList.size(); i++) {
            tabLayout.addTab(tabLayout.newTab().setIcon(licons[i]).setText(mTitleList.get(i)), i == 0 ? true : false);
        }
        tabLayout.setTabTextColors(Color.BLACK, Color.RED);
        mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏androidBlog

仿网易新闻的顶部导航指示器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details...

1401
来自专栏向治洪

android移动view

import android.app.Activity;   import android.content.Context;   import android....

1757
来自专栏Jack的Android之旅

淘宝开源库VLayout实践

最近淘宝出了vlayout,刚开始看淘宝的文档的时候还是有点懵,后来自己也总结规划了一下,写了一个比较好看的demo,顺便在这里总结一下。

1842
来自专栏xingoo, 一个梦想做发明家的程序员

【插件开发】—— 7 SWT布局详解,不能再详细了!

前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭...

22710
来自专栏学海无涯

Android开发之自定义View(二)

在 Android开发之自定义View(一)中,讲解了最复杂的一种自定义View,本次将剩下的两种讲完~~~ go,go,go 继承原有的控件,在原有控件基础上...

3338
来自专栏Felix的技术分享

Android ListView头部视差控件

1403
来自专栏Android干货园

Android源码解析-仿今日头条PagerSlidingTabStrip滑动页面导航效果

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/48...

4332
来自专栏向治洪

Palette状态栏颜色提取,写的不错就分享了

Palette 说Palette之前先说下前面提到的Pager。ViewPager是什么大家应该都是知道的了,一般ViewPager、xxxTabStrip...

2296
来自专栏androidBlog

自定义Drawable实现圆角图片和圆形图片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1652
来自专栏Android开发指南

1.viewpager

37413

扫码关注云+社区

领取腾讯云代金券