如何通过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
相关产品推荐
相关产品推荐

