Добавление пользовательских шрифтов для android api 14

Ошибка
ошибка: атрибут стиля 'app: attr / fontFamily' не найден. Сообщение {kind = ERROR, text = error: style attribute 'app: attr / fontFamily' не найдено.

<style name = "RadioButtonCustomStyle" parent = "Widget.AppCompat.CompoundButton.RadioButton">
    <item name = "android:textColorPrimaryDisableOnly">#f44336</item>
    <item name = "android:textColor">#607ba3</item>
    <item name = "app:fontFamily">@font/raleway_medium</item>
</style>

Я добавил raleway_medium.ttf в приложение / активы / шрифт / raleway_medium.ttf

Вам нужно установить шрифт программно, например, ответ это

Rutvik Bhatt 05.12.2018 14:47

Спасибо @RutvikBhatt, но в этом процессе это заставляет меня повторять процесс много раз

Tecno krates 05.12.2018 15:02

создайте такой метод, как public static void setTypeface(RadioButton radioButton){//your code to set typeface}, в классе Utils и вызовите его из любого места, например Utils.setTypeface(objRadio);

Rutvik Bhatt 06.12.2018 04:40
1
3
367
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Добавьте свой шрифт в папку font (app / res / font).

После этого вы можете использовать текстовое представление и установить шрифт

<TextView
    android:id = "@+id/ID"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:fontFamily = "@font/YourFont"
    android:text = "@string/YourText"
    android:textColor = "@color/YourColor"
    android:textSize = "20dp" />

В своем стиле вы можете попробовать заменить "app: fontFamily" на "android: fontFamily"

Надеюсь, это поможет

Мое решение работает, ребята, зачем вы мне -1 ставите без экспликации xD?

Mathieu Heuzey 05.12.2018 16:02

Я не проверял это, но на странице разработчиков Android написано, что ваше решение не работает с API 14 - возможно, это причина

Zielony 18.12.2018 22:24
Ответ принят как подходящий

Вы можете сделать это, поместив свой шрифт в папку с ресурсами и используя приведенный ниже код:

Typeface tf = Typeface.createFromAsset(getAssets(), "your_font.ttf"); yourTextView.setTypeface(tf);

Но мне сложно повторить .setTypeFace для нескольких представлений.

Tecno krates 05.12.2018 15:15

К сожалению, это единственный способ, которым я знаю :(

Vinicius Lino 05.12.2018 15:25

Есть библиотека под названием «Каллиграфия». Он используется в таких случаях, как ваш - для замены шрифтов во всех представлениях на старых телефонах. Если я прав, он не поддерживает ресурсы шрифтов, а только простые файлы .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) {
    }
}

Другие вопросы по теме