解决SlidingTabLayout第一次进入界面时,title字体不能设置为加粗的问题
方法一:下载源码=== 需要修改SlidingTabLayout.updateTabStyles()函数中的源码(加**的部分)
` private void updateTabStyles() { ......
if (mTextBold == TEXT_BOLD_BOTH) {
tv_tab_title.getPaint().setFakeBoldText(true);
} else if (mTextBold == TEXT_BOLD_NONE) {
tv_tab_title.getPaint().setFakeBoldText(false);
} **else if (mTextBold == TEXT_BOLD_WHEN_SELECT) {
tv_tab_title.getPaint().setFakeBoldText(mCurrentTab == i);**
}
}
}
}`
方法二:不用下载源码===
步骤1:在初始化时将第一个tab的title设置为粗体
binding.viewPager.setAdapter(tabAdapter); binding.slidingTabLayout.setViewPager(binding.viewPager); //第一次进入时将第一个tab设置为粗体 TextView titleView = binding.slidingTabLayout.getTitleView(0); titleView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
步骤2:在ViewPager的切换监听中再将第一个tab的title设置为正常
` binding.viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
LogUtils.e("当前tab2::::"+position);
//切换时将第一个tab字体设置为正常情况
TextView titleView = binding.slidingTabLayout.getTitleView(0);
titleView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
//设置为粗体
binding.slidingTabLayout.setTextBold(1);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});`
注意:如果要修改indicator的高度,需要将SlidingTabLayout高度设置成wrap_content
纠正一下方法二,这种修改只在title只有两个的时候有效,如果有多个,就有bug。现在可以在onPageSelected(int position)方法内修改,先将所有title字体设置为正常,再将当前title设置为粗体。代码如下: ` @Override public void onPageSelected(int position) {
//切换时将所有tab字体设置为正常
int length = titles.length;
for (int i = 0; i < length; i++) {
TextView titleView = binding.slidingTabLayout.getTitleView(i);
titleView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
}
//将当前选中的tab设置为粗体
TextView currentView = binding.slidingTabLayout.getTitleView(position);
currentView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
}
`
切换viewpager时,title字体也不能加粗?
切换viewpager时,title字体也不能加粗?
可以的
通过反射调用updateTabSelection(position)这个方法,会更加简单一点来解决这个bug,我贴一下代码 try { val updateTabMethod = tabLayout?.javaClass?.getDeclaredMethod("updateTabSelection", Int::class.java) updateTabMethod?.isAccessible = true updateTabMethod?.invoke(tabLayout!!, 0) } catch(e: Exception) { }
//TabLayout默认选中第一个 这个地方要注意由于第一个有选中字体加粗效果 第三方框架BUG如果直接选中0位没有加粗效果 slidingTabLayout.setCurrentTab(1); slidingTabLayout.setCurrentTab(0);
这应该是最简单的办法