Есть библиотека под названием Каллиграфия.Он используется в таких случаях, как ваш - для замены шрифтов во всех видах на старых телефонах.Если я прав, он не поддерживает шрифтовые ресурсы, а просто файлы .ttf.См .: https://github.com/chrisjenx/Calligraphy
Я работаю над библиотекой с поддержкой ресурсов шрифтов для старых телефонов.Он работает чище, чем Каллиграфия, но сама библиотека очень большая, поэтому она может не подойти для вас.Фиксация поддержки шрифтов хорошо извлечена, и вы можете найти ее здесь: https://github.com/ZieIony/Carbon/commit/baefcfb1941ecc1b4e293f31f5220ab7abaf4584
И основная часть ответа - следующий метод.Я думаю, это было взято из источников компонентов материалов.Вы можете добавить его в свои текстовые поля и кнопки, чтобы использовать его для обработки атрибута xml.
private void handleFontAttribute(TypedArray appearance, int textStyle, int attributeId) {
WeakReference<android.widget.TextView> textViewWeak = new WeakReference<>(this);
AtomicBoolean asyncFontPending = new AtomicBoolean();
ResourcesCompat.FontCallback replyCallback = new ResourcesCompat.FontCallback() {
@Override
public void onFontRetrieved(@NonNull Typeface typeface) {
if (asyncFontPending.get()) {
android.widget.TextView textView = textViewWeak.get();
if (textView != null)
textView.setTypeface(typeface, textStyle);
}
}
@Override
public void onFontRetrievalFailed(int reason) {
}
};
try {
int resourceId = appearance.getResourceId(attributeId, 0);
TypedValue mTypedValue = new TypedValue();
Typeface typeface = ResourcesCompat.getFont(getContext(), resourceId, mTypedValue, textStyle, replyCallback);
if (typeface != null) {
asyncFontPending.set(true);
setTypeface(typeface, textStyle);
}
} catch (UnsupportedOperationException | Resources.NotFoundException ignored) {
}
}