До API-27 вам нужен собственный подкласс CharacterStyle
для применения пользовательского Typeface
к Spannable
.
Пример:
var sushiFont = Typeface.CreateFromAsset(Assets, "Tastysushi.ttf");
var spannable = new SpannableString("123 = SushiHangover");
spannable.SetSpan (new CustomTypefaceSpan(sushiFont), 3, spannable.Length(), SpanTypes.ExclusiveInclusive);
button.SetText(spannable, TextView.BufferType.Spannable);
Или в API-21 (+), вы можете избежать SetSpan
индексации начала / конца символа, используя SpannableStringBuilder.Append
:
var sushiFont = Typeface.CreateFromAsset(Assets, "Tastysushi.ttf");
var spannableString = new SpannableStringBuilder("123");
var spannable = new SpannableString(" = SushiHangover");
spannableString.Append(spannable, new CustomTypefaceSpan(sushiFont), SpanTypes.ExclusiveInclusive);
button.SetText(spannableString, TextView.BufferType.Spannable);
А в API-28 + вы можете напрямую создавать диапазоны, которые напрямую включают другойTypeface
без использования подкласса CharacterStyle
:
spannableString.Append(spannable, new TypefaceSpan(sushiFont), SpanTypes.ExclusiveInclusive);
CustomTypefaceSpan class
public class CustomTypefaceSpan : MetricAffectingSpan
{
readonly Typeface typeFace;
public CustomTypefaceSpan(Typeface typeFace)
{
this.typeFace = typeFace;
}
public override void UpdateDrawState(TextPaint tp)
{
tp.SetTypeface(typeFace);
}
public override void UpdateMeasureState(TextPaint p)
{
p.SetTypeface(typeFace);
}
}