You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:10:20