Поскольку оба ответа MJM
и TheMatrix
практически одинаковы (но слишком сложны для меня), и оба ответа были даны примерно в одно и то же время, я не мог просто выбрать один из них, поэтому я предоставил +1 для каждого, попросив их сделать его короче, но с поддержкой XML-тега для облегчения работы со строкой.
А пока вот гораздо более короткая версия того, как установить собственный шрифт для части текста в TextView:
class CustomTypefaceSpan(private val typeface: Typeface?) : MetricAffectingSpan() {
override fun updateDrawState(paint: TextPaint) {
paint.typeface=typeface
}
override fun updateMeasureState(paint: TextPaint) {
paint.typeface=typeface
}
}
Пример использования:
val text = "Hello world"
val index = text.indexOf(' ')
val spannable = SpannableStringBuilder(text)
spannable.setSpan(CustomTypefaceSpan(ResourcesCompat.getFont(this, R.font.lato_light)), 0, index, Spanned.SPAN_EXCLUSIVE_INCLUSIVE)
spannable.setSpan(CustomTypefaceSpan(ResourcesCompat.getFont(this, R.font.lato_bold)), index, text.length, Spanned.SPAN_EXCLUSIVE_INCLUSIVE)
textView.text = spannable
РЕДАКТИРОВАТЬ: кажется, Google предоставил видео об этом, здесь :
class CustomTypefaceSpan(val font: Typeface?) : MetricAffectingSpan() {
override fun updateMeasureState(textPaint: TextPaint) = update(textPaint)
override fun updateDrawState(textPaint: TextPaint?) = update(textPaint)
private fun update(tp: TextPaint?) {
tp.apply {
val old = this!!.typeface
val oldStyle = old?.style ?: 0
val font = Typeface.create(font, oldStyle)
typeface = font
}
}
}
И решение обработки этого в strings.xml также обсуждается на видео, здесь , но с использованием аннотаций вместо новых тегов HTML. Пример: * 1 023 *
strings.xml
<string name="title"><annotation font="lato_light">Hello</annotation> <annotation font="lato_bold">world</annotation></string>
MainActivity.kt
val titleText = getText(R.string.title) as SpannedString
val spannable = SpannableStringBuilder(titleText)
val annotations = titleText.getSpans(0, titleText.length, android.text.Annotation::class.java)
for (annotation in annotations) {
if(annotation.key=="font"){
val fontName=annotation.value
val typeface= ResourcesCompat.getFont(this@MainActivity,resources.getIdentifier(fontName,"font",packageName))
spannable.setSpan(CustomTypefaceSpan(typeface),spannable.getSpanStart(annotation),spannable.getSpanEnd(annotation), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
}
textView.text = spannable
И результат:
Тем не менее я почти уверен, что можно использовать из HTML, но, вероятно, оно того не стоит.
Мне также интересно, что нужно делать, если мы хотим использовать как основные теги HTML, так и теги cusomzied, которые мы установили для шрифта, если мы действительно используем annotation
там.