在开发的过程中,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做所有可操作,想怎么改就怎么改!