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

如何通过Spannable在TextView内容中使用支持库字体功能?

用Spannable为TextView部分内容设置自定义TTF字体

没问题!其实用Spannable给TextView的部分文字设置你放在res/font里的自定义TTF字体,操作起来很直观,咱们结合你提到的支持库来一步步实现:

核心思路

默认的TypefaceSpan只支持系统内置字体族,所以咱们需要自定义一个MetricAffectingSpan的子类来加载自定义字体,或者在高版本系统上用更简洁的API。

方法一:兼容全版本的自定义Span(推荐)

首先写一个自定义的CustomTypefaceSpan类,用来承载咱们的自定义字体:

import android.graphics.Paint
import android.graphics.Typeface
import android.text.style.MetricAffectingSpan

class CustomTypefaceSpan(private val typeface: Typeface) : MetricAffectingSpan() {
    override fun updateDrawState(ds: TextPaint) {
        applyCustomTypeface(ds)
    }

    override fun updateMeasureState(paint: TextPaint) {
        applyCustomTypeface(paint)
    }

    private fun applyCustomTypeface(paint: TextPaint) {
        val oldTypeface = paint.typeface
        val oldStyle = oldTypeface?.style ?: 0

        // 保留原文字的样式(比如加粗、斜体),只替换字体
        paint.typeface = Typeface.create(typeface, oldStyle)
    }
}

然后在代码中使用这个Span:

// 1. 获取res/font里的自定义字体
val customTypeface = ResourcesCompat.getFont(context, R.font.lato_black)!!

// 2. 创建SpannableString对象
val spannableText = SpannableString("这是普通文字,这部分是自定义字体的内容")

// 3. 给指定范围的文字设置自定义字体(示例:从第6个字符到第16个字符)
spannableText.setSpan(
    CustomTypefaceSpan(customTypeface),
    6,
    16,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

// 4. 把处理后的文字设置到TextView
yourTextView.text = spannableText

方法二:API 26+ 简洁方案

如果你的App最低兼容版本是Android 8.0(API 26)及以上,可以直接用系统提供的FontFamilySpan,不用自定义Span:

import android.graphics.fonts.FontFamily
import android.text.style.FontFamilySpan

// 1. 创建FontFamily对象
val fontFamily = FontFamily.Builder(resources.getFont(R.font.lato_black)).build()

// 2. 创建FontFamilySpan并应用到Spannable
val spannableText = SpannableString("普通文字,这部分是自定义字体")
spannableText.setSpan(
    FontFamilySpan(fontFamily),
    5,
    15,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

yourTextView.text = spannableText

注意事项

  • 记得确保res/font文件夹下的TTF字体文件已经正确放置,并且在R.font中能正常引用
  • 自定义的CustomTypefaceSpan会保留原文字的样式(比如原有加粗、斜体),不会因为替换字体而丢失这些效果

内容的提问来源于stack exchange,提问作者android developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:46:21