Android Tablayout + viewpager 切换时修改tablayout title(标题)的字体颜色和字体大小

本文介绍如何在Android开发中,使用Tablayout+ViewPager实现Fragment切换时,动态修改Tablayout标题的字体颜色和大小。通过创建自定义的TextView并将其设置为TabLayout的Tab,再利用TabLayout的addOnTabSelectedListener监听切换事件,实现在切换时灵活地定制标题样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发的过程中,tablayout + viewpager + fragment 是很常用的组合,如果没有特别的要求,一般都能够满足,tablayout 和viewpager之间的配合其实最重要最直接的就是tableayout的addOnTabSelectedListener 和 viewpager 的addOnPageChangeListener,在切换的时候都会互相的切换对方的当前选中项,其中Tablayout 中的两个静态内部类很直接的说明了tablayout和viewpager之间的关系 TabLayoutOnPageChangeListener 和 ViewPagerOnTabSelectedListener:

内部内TabLayoutOnPageChangeListener :

public static class TabLayoutOnPageChangeListener implements ViewPager.OnPageChangeListener {
        private final WeakReference<TabLayout> mTabLayoutRef;
        private int mPreviousScrollState;
        private int mScrollState;

        public TabLayoutOnPageChangeListener(TabLayout tabLayout) {
            mTabLayoutRef = new WeakReference<>(tabLayout);
        }

        @Override
        public void onPageScrollStateChanged(final int state) {
            mPreviousScrollState = mScrollState;
            mScrollState = state;
        }

        @Override
        public void onPageScrolled(final int position, final float positionOffset,
                final int positionOffsetPixels) {
            final TabLayout tabLayout = mTabLayoutRef.get();
            if (tabLayout != null) {
                // Only update the text selection if we're not settling, or we are settling after
                // being dragged
                final boolean updateText = mScrollState != SCROLL_STATE_SETTLING ||
                        mPreviousScrollState == SCROLL_STATE_DRAGGING;
                // Update the indicator if we're not settling after being idle. This is caused
                // from a setCurrentItem() call and will be handled by an animation from
                // onPageSelected() instead.
                final boolean updateIndicator = !(mScrollState == SCROLL_STATE_SETTLING
                        && mPreviousScrollState == SCROLL_STATE_IDLE);
                tabLayout.setScrollPosition(position, positionOffset, updateText, updateIndicator);
            }
        }

        @Override
        public void onPageSelected(final int position) {
            final TabLayout tabLayout = mTabLayoutRef.get();
            if (tabLayout != null && tabLayout.getSelectedTabPosition() != position
                    && position < tabLayout.getTabCount()) {
                // Select the tab, only updating the indicator if we're not being dragged/settled
                // (since onPageScrolled will handle that).
                final boolean updateIndicator = mScrollState == SCROLL_STATE_IDLE
                        || (mScrollState == SCROLL_STATE_SETTLING
                        && mPreviousScrollState == SCROLL_STATE_IDLE);
                tabLayout.selectTab(tabLayout.getTabAt(position), updateIndicator);
            }
        }

        void reset() {
            mPreviousScrollState = mScrollState = SCROLL_STATE_IDLE;
        }
}

内部类ViewPagerOnTabSelectedListener :

public static class ViewPagerOnTabSelectedListener implements TabLayout.OnTabSelectedListener {
        private final ViewPager mViewPager;

        public ViewPagerOnTabSelectedListener(ViewPager viewPager) {
            mViewPager = viewPager;
        }

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            mViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            // No-op
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            // No-op
        }
    }

现在进入正题,修改tablayout上title的字体大小和颜色,百度搜索到的基本都是对其 app:tabTextAppearance=”@style/tablayout_text_size” 进行设置和修改的,但是这个好像没什么用或者说达不到我要的效果吧!
在我这里我的tablayout的标题是用
tlProduct.addTab(tlProduct.newTab().setCustomView(textView));
这里是设置的TextView,这样在Tablayout的 addOnTabSelectedListener中才有接口进行修改。
这里不要用:tlProduct.setupWithViewPager(viewPager);

viewpager 的addOnPageChangeListener:

viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tlProduct));
这里是为了让在滑动viewpager的时候能够正确的切换tablayout的标题

Tablayout 的 addOnTabSelectedListener :

 tlProduct.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager){

            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

                View view = tab.getCustomView();
                if (null != view && view instanceof TextView) {
                    ((TextView) view).setTextSize(16);
                    ((TextView) view).setTextColor(ContextCompat.getColor(mActivity, R.color.white));
                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                // No-op
                View view = tab.getCustomView();
                if (null != view && view instanceof TextView) {
                    ((TextView) view).setTextSize(12);
                    ((TextView) view).setTextColor(ContextCompat.getColor(mActivity, R.color.black));
                }
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                // No-op
            }
        });

在这里直接就可以对TextView做所有可操作,想怎么改就怎么改!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值