设置Tab文本粗体时保留Montserrat字体而非切换为Roboto的方法
解决Tab粗体设置保留自定义Montserrat字体的问题
你的问题出在直接使用Typeface.DEFAULT_BOLD赋值,这会强制替换掉TextView从主题继承的Montserrat字体,改用系统默认的Roboto粗体。下面提供两种可靠的解决思路:
方法一:基于原有字体调整字重
无需额外字体文件,直接获取Tab文本当前的Typeface,在此基础上修改粗体属性:
修改setTabTypeface函数
fun setTabTypeface(tab: TabLayout.Tab, isBold: Boolean) { for (i in 0 until tab.view.childCount) { val tabViewChild = tab.view.getChildAt(i) if (tabViewChild is TextView) { // 获取当前TextView的原有字体(即主题设置的Montserrat) val originalTypeface = tabViewChild.typeface // 创建对应字重的字体变体 val newTypeface = Typeface.create(originalTypeface, if (isBold) Typeface.BOLD else Typeface.NORMAL) tabViewChild.typeface = newTypeface } } }
修改调用逻辑
fun TabLayout.onTabSelectedListener( onFollowClickListener: ((String) -> Unit), ) { this.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { setTabTypeface(tab, true) // 设置为粗体 } override fun onTabUnselected(tab: TabLayout.Tab?) { tab?.let { setTabTypeface(it, false) } // 恢复常规字重 } override fun onTabReselected(tab: TabLayout.Tab?) { } }) }
方法二:直接使用Montserrat粗体字体文件
如果你的项目中已经包含Montserrat的粗体字库文件(如montserrat_bold.ttf),直接引用对应字体文件能获得更精准的显示效果:
1. 定义字体获取工具方法
fun getMontserratTypeface(context: Context, isBold: Boolean): Typeface { // 根据是否粗体选择对应的字体资源 val fontResId = if (isBold) R.font.montserrat_bold else R.font.montserrat return ResourcesCompat.getFont(context, fontResId) ?: Typeface.DEFAULT }
2. 修改setTabTypeface函数
fun setTabTypeface(tab: TabLayout.Tab, context: Context, isBold: Boolean) { val targetTypeface = getMontserratTypeface(context, isBold) for (i in 0 until tab.view.childCount) { val tabViewChild = tab.view.getChildAt(i) if (tabViewChild is TextView) { tabViewChild.typeface = targetTypeface } } }
3. 修改调用逻辑
fun TabLayout.onTabSelectedListener( context: Context, onFollowClickListener: ((String) -> Unit), ) { this.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { setTabTypeface(tab, context, true) } override fun onTabUnselected(tab: TabLayout.Tab?) { tab?.let { setTabTypeface(it, context, false) } } override fun onTabReselected(tab: TabLayout.Tab?) { } }) }
注意事项
- 确保
res/font目录下存在montserrat.ttf(常规字重)和montserrat_bold.ttf(粗体)文件; - 调用时需传入当前上下文
context。
内容的提问来源于stack exchange,提问作者flex
相关产品推荐
相关产品推荐

