Спеціальні шрифти та макети XML (Android)


174

Я намагаюся визначити макет GUI, використовуючи XML-файли в Android. Наскільки я можу дізнатися, немає способу вказати, що ваші віджети повинні використовувати спеціальний шрифт (наприклад, той, який ви розмістили в активах / шрифті /) у файлах XML, і ви можете використовувати лише шрифти, встановлені системою.

Я знаю, що в коді Java я міг змінити шрифт кожного віджета вручну, використовуючи унікальні ідентифікатори. Крім того, я міг би повторити всі віджети на Java, щоб зробити цю зміну, але це, ймовірно, буде дуже повільним.

Які ще є варіанти? Чи є кращі способи виготовлення віджетів, які мають власний вигляд? Мені особливо не хочеться вручну змінювати шрифт для кожного нового доданого віджета.


68
DrDefrost - прийміть відповіді, ви отримаєте більше відповідей на цьому сайті.
SK9

1
Ось ще одне схоже запитання: stackoverflow.com/questions/9030204/…
Vins

Оновлено 05/2017: "Бібліотека підтримки 26.0 Beta надає підтримку функції" Шрифти в XML "на пристроях, що працюють на Android API версії 14 і новіших." Дивіться: developer.android.com/preview/features/…
albert c braun

Відповіді:


220

Ви можете розширити TextView, щоб встановити спеціальні шрифти, як я дізнався тут .

TextViewPlus.java:

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }

}

attrs.xml: (у res / величинах)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TextViewPlus">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="saxmono.ttf">
    </com.example.TextViewPlus>
</LinearLayout>

Ви б помістили "saxmono.ttf" у папку активів .

ОНОВЛЕННЯ 8/1/13

У цього способу є серйозні проблеми з пам'яттю. Дивіться коментар chedabob нижче.


5
Це виглядає приємно, однак я отримую помилку, коли намагаюся використовувати "TextViewPlus" в main.xml. Я отримую наступне: - помилка: помилка розбору XML: незв’язаний префікс - префікс "foo" для атрибута "foo: customFont", пов'язаний з типом елемента "supportLibs.TextViewPlus", не пов'язаний.
Majjoodi

79
Варто зазначити, що це генерує десятки і десятки об'єктів TypeFace і з'їдає пам'ять. Існує помилка в до-4.0 Android, який не вивільняє TypeFaces належним чином. Найпростіше зробити це створити кеш TypeFace за допомогою HashMap. Це знизило використання пам'яті в моєму додатку з 120+ mb до 18mb. code.google.com/p/android/isissue/detail?id=9904
chedabob

7
@Majjoodi: Зазвичай це відбувається, якщо ви забудете додати 2-й простір імен до своєї верстки:xmlns:foo="http://schemas.android.com/apk/res/com.example
Theo

11
ДУЖЕ ВАЖЛИВО - я просто хотів би подвоїти пораду чедабоба. Якщо ви не дотримуєтесь цього, у вас буде витік пам'яті в попередньому ICS. Рішень мало, одне з них знаходиться у посиланні, наданому chedabob, інше - тут: stackoverflow.com/questions/8057010/listview-memory-leak . peter - будь ласка, оновіть свою відповідь - це чудово, але не повно
Michał K

1
Як встановити цей спеціальний атрибут у styles.xml на додаток до інших атрибутів textview, таких як ширина та висота?
loeschg

35

Я спізнююсь на 3 роки на вечірку :( Однак це може бути корисним для того, хто може натрапити на цю посаду.

Я написав бібліотеку, яка кешує шрифти, а також дозволяє вказати спеціальні шрифти прямо з XML. Бібліотеку ви можете знайти тут .

Ось як виглядатиме ваш макет XML під час його використання.

<com.mobsandgeeks.ui.TypefaceTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    geekui:customTypeface="fonts/custom_font.ttf" />

Привіт @ Ragunath-jawahar, як би я імпортував бібліотеку для проекту gradle? Я спробував, compile 'com.mobsandgeeks:android-typeface-textview:1.0'але це не вийшло.
aimango

1
Вам знадобиться AAR, щоб мати можливість використовувати його таким чином. Його ще немає. Наразі ви можете скопіювати джерела та створити проект бібліотеки Android Studio.
Рагунат Джавахар

2
звідки беруться ваші теги Geekui?
sefirosu

3
З простору імен, зазначених у батьківському тезі, -xmlns:geekui="http://schemas.android.com/apk/res-auto"
Рагунат Джавахар

1
@MuhammedRefaat, так, це так :)
Рагунат Джавахар

18

Це може бути трохи пізно, але вам потрібно створити однотонний клас, який повертає спеціальний шрифт, щоб уникнути витоку пам'яті.

Клас TypeFace:

public class OpenSans {

private static OpenSans instance;
private static Typeface typeface;

public static OpenSans getInstance(Context context) {
    synchronized (OpenSans.class) {
        if (instance == null) {
            instance = new OpenSans();
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), "open_sans.ttf");
        }
        return instance;
    }
}

public Typeface getTypeFace() {
    return typeface;
}
}

Спеціальний TextView:

public class NativelyCustomTextView extends TextView {

    public NativelyCustomTextView(Context context) {
        super(context);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

}

За xml:

<com.yourpackage.views.NativelyCustomTextView
            android:id="@+id/natively_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_margin="20dp"
            android:text="@string/natively"
            android:textSize="30sp" /> 

Програмно:

TextView programmaticallyTextView = (TextView) 
       findViewById(R.id.programmatically_text_view);

programmaticallyTextView.setTypeface(OpenSans.getInstance(this)
                .getTypeFace());

Здається, працює під час виконання, але чи варто працювати в дизайнері?
Магнус Йоханссон

Звичайно. Ви можете використовувати як xml. @Magnus
Леонардо Кардосо

Я думаю, що ви неправильно зрозуміли, це, здається, не працює в час дизайну (попередній перегляд дизайнера). (xml! = дизайнер). Він прекрасно працює в файлі макета Xml, складеному під час виконання. У будь-якому випадку, я використовую це розширення github.com/danh32/Fontify , яке працює набагато краще для моїх потреб (воно підтримує кілька стилів шрифту, регулярні, жирні тощо), а також різні назви шрифтів, а також інші елементи управління поза TextView)
Магнус Йоханссон

2
GetTypeFace створює новий шрифт для кожного дзвінка ... це перемагає мету синглтона. У ньому повинно бути статичне поле, яке встановлюється під час першого виклику та повертає значення поля при наступних викликах.
Стівен Пена

1
@chiwai ти маєш рацію! Щодо першого питання він не потрібен. О другій це була помилка друку.
Леонардо Кардосо

13

Старе запитання, але я впевнений, що хотів би прочитати цю відповідь тут, перш ніж розпочати власний пошук хорошого рішення. Каліграфія розширює android:fontFamilyатрибут, щоб додати підтримку спеціальних шрифтів у папці ресурсів, наприклад:

<TextView 
  android:text="@string/hello_world"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:fontFamily="fonts/Roboto-Bold.ttf"/>

Єдине, що вам потрібно зробити, щоб активувати його, - це приєднати його до контексту діяльності, яку ви використовуєте:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}

Ви також можете вказати власний спеціальний атрибут для заміни android:fontFamily

Він також працює в темах, включаючи AppTheme.


8

Використання прив'язки даних :

@BindingAdapter({"bind:font"})
public static void setFont(TextView textView, String fontName){
 textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
}

У XML:

<TextView
app:font="@{`Source-Sans-Pro-Regular.ttf`}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

файл шрифту повинен бути в assets/fonts/


7

Якщо у вас є лише один шрифт, який ви хочете додати, і хочете менше писати код, ви можете створити виділений TextView для вашого конкретного шрифту. Дивіться код нижче.

package com.yourpackage;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {
    public static Typeface FONT_NAME;


    public FontTextView(Context context) {
        super(context);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
}

У main.xml тепер ви можете додати textView так:

<com.yourpackage.FontTextView
    android:id="@+id/tvTimer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="" />

зробіть це на init () і збережіть 3x той самий дзвінок.
ericosg

@ericosg Я отримую цю помилку, коли я використовую це рішення android.view.InflateException: Рядок файлу бінарних файлів XML №9: Помилка завищення класу com.ascent.adwad.utils.CustomTextView
Sagar Devanga

@SagarDevanga, важко допомогти без додаткової інформації. Можливо, візьміть це, наскільки можете, і поставте нове запитання.
ericosg

7

Найкращий спосіб зробити це з випуску попереднього перегляду Android O таким чином
1.) Клацніть правою кнопкою миші папку Res та перейдіть до каталогу New> Android . З'явиться
вікно Новий каталог ресурсів.
2.) У списку типу ресурсу виберіть шрифт та натисніть кнопку ОК.
3.) Додайте файли шрифтів у папку шрифтів . Структура папок нижче створює R.font.dancing_script, R.font.la_la та R.font.ba_ba.
4.) Двічі клацніть файл шрифту, щоб переглянути його шрифти в редакторі.

Далі ми повинні створити сімейство шрифтів

1.) Клацніть правою кнопкою миші папку шрифту та перейдіть до пункту «Новий> файл ресурсу шрифту» . З'явиться вікно Новий файл ресурсу.
2.) Введіть ім'я файлу та натисніть кнопку ОК . У редакторі відкриється новий ресурс шрифту XML.
3.) Вкладіть кожен елемент шрифту, стиль та вагу в елемент тегу шрифту. Наступний XML ілюструє додавання пов'язаних з шрифтом атрибутів у ресурс шрифту XML:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
    android:fontStyle="normal"
    android:fontWeight="400"
    android:font="@font/hey_regular" />
    <font
    android:fontStyle="italic"
    android:fontWeight="400"
    android:font="@font/hey_bababa" />
</font-family>

Додавання шрифтів у TextView:

   <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    **android:fontFamily="@font/ba_ba"**/>

З документації

Робота з шрифтами

всі кроки правильні.


1
Найкраща відповідь! Ім'я файлу шрифту повинно бути в малому регістрі.
Дмитро

Ви також можете створити користувацький стиль, який застосовуватимете до своєї програми (під файлом AndroidManifest), і вона буде надана ВСІМ переглядам. Замість того, щоб просто розмістити його на одному TextView, оскільки це не вплине на Панель інструментів.
goldenmaza

5

Розширіть TextViewі надайте йому спеціальний атрибут або просто скористайтеся атрибутом тега android: tag для передачі рядка того шрифту, який ви хочете використовувати. Вам потрібно вибрати конвенцію та дотримуватися її, наприклад, я покладу всі мої шрифти в папку res / tools / fonts /, щоб ваш клас TextView знав, де їх знайти. Потім у своєму конструкторі ви просто встановлюєте шрифт вручну після супервиклику.


4

Єдиний спосіб використання спеціальних шрифтів - це вихідний код.

Пам'ятайте лише, що Android працює на пристроях з дуже обмеженими ресурсами та шрифтами, можливо, потрібна велика кількість оперативної пам’яті. Вбудовані шрифти Droid виготовлені спеціально, і, якщо ви зауважили, відсутні багато символів та прикрас.


"Пам'ятайте лише, що Android працює на пристроях з дуже обмеженими ресурсами" -> це все менше і менше. Квадратний основний телефон? Дійсно ??
Сенді

9
Я хотів би зробити більше, щоб проаналізувати контекст відповіді tareqHs, який передував вашому коментарю за два з половиною роки.
SK9

Перша частина вашої відповіді, можливо, була правдивою, коли ви писали свою відповідь у 2010 році. Остання є надлишковою величиною і, крім того: Дроїд був поганий, вирваний Google у 2012 році на користь Робото. Відсутність вибору типографії в Android - це недолік, а не особливість; iOS має розроблені розробниками шрифти з 2008 року під примітивними пристроями за сучасними стандартами.
cosmix

Ця відповідь більше не є дійсною.
Мартін Конечний

2

У мене може бути проста відповідь на питання, не розширюючи TextView і не застосовуючи довгий код.

Код:

 TextView tv = (TextView) findViewById(R.id.textview1);
    tv.setTypeface(Typeface.createFromAsset(getAssets(), "font.ttf"));

Помістіть спеціальний файл шрифту в папку активів, як зазвичай, і спробуйте це. Це працює для мене. Я просто не розумію, чому Пітер дав такий величезний код для цієї простої речі або він дав свою відповідь у старій версії.


2

Також можна визначити в xml без створення спеціальних класів

style.xml

<style name="ionicons" parent="android:TextAppearance">
    <!-- Custom Attr-->
    <item name="fontPath">fonts/ionicons.ttf</item>
</style>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/ionicons"
        android:text=""/>
</LinearLayout>

Швидка примітка, тому що я завжди завжди забував, куди слід розміщувати шрифти, це те, що шрифт повинен бути всередині, assetsі ця папка знаходиться на тому ж рівні, що resі srcв моєму випадку йогоassets/fonts/ionicons.ttf

Оновлений Доданий корінковий макет, оскільки цей метод потребує xmlns:app="http://schemas.android.com/apk/res-auto"роботи

Оновлення 2 Забув про бібліотеку, яку я встановив перед тим, як називати Каліграфія


Це не працює для мене. Коли я намагаюся створити це, я отримую повідомлення про помилку: Помилка: (49, 5) Не знайдено жодного ресурсу, який би відповідав заданому імені: attr 'fontPath'.
Стеф

Спробуйте додати xmlns:app="http://schemas.android.com/apk/res-auto"до кореневого макета, перевірте також оновлену відповідь
norman784

Помилка походить не від файлу XML-макета, а від файлу XML-стилів. Здається, він не "знає", що таке шрифт.
Стеф

Ваше право, забув, що я маю бібліотеку під назвою Calligrapy
norman784

1

Відповідь Петра найкраща, але її можна покращити, використовуючи styles.xml від Android, щоб налаштувати ваші шрифти для всіх переглядів тексту у вашій програмі.

Мій код тут


1

Є два способи налаштування шрифтів:

!!! мій спеціальний шрифт в активах / шрифтах / iran_sans.ttf

Спосіб 1: Reflation Typeface.class |||Кращий спосіб

виклик FontsOverride.setDefaultFont () у класі розширює додаток. Цей код призведе до зміни всіх програмних шрифтів, навіть Tost Tost

AppController.java

public class AppController extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Initial Font
        FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");

    }
}

FontsOverride.java

public class FontsOverride {

    public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) {
        final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName);
        replaceFont(staticTypefaceFieldName, regular);
    }

    private static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) {
        try {
            final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName);
            staticField.setAccessible(true);
            staticField.set(null, newTypeface);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

Спосіб 2: використовуйте setTypeface

для спеціального перегляду просто зателефонуйте setTypeface (), щоб змінити шрифт.

CTextView.java

public class CTextView extends TextView {

    public CTextView(Context context) {
        super(context);
        init(context,null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context,attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        // use setTypeface for change font this view
        setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));

    }
}

FontUtils.java

public class FontUtils {

    private static Hashtable<String, Typeface> fontCache = new Hashtable<>();

    public static Typeface getTypeface(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if (tf == null) {
            try {
                tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

}

0

Ось підручник, який показує, як налаштувати спеціальний шрифт, як @peter описано: http://responsiveandroid.com/2012/03/15/custom-fonts-in-android-widgets.html

він також враховує можливі витоки пам'яті ala http://code.google.com/p/android/isissue/detail?id=9904 . Також у підручнику є приклад встановлення спеціального шрифту на кнопці.


0

Ви можете легко створити спеціальний клас перегляду тексту: -

Отже, що вам потрібно зробити спочатку, скласти Custom textviewклас, який продовжено AppCompatTextView.

public class CustomTextView extends AppCompatTextView {
    private int mFont = FontUtils.FONTS_NORMAL;
    boolean fontApplied;

    public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs, context);
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, context);
    }

    public CustomTextView(Context context) {
        super(context);
        init(null, context);
    }

    protected void init(AttributeSet attrs, Context cxt) {
        if (!fontApplied) {
            if (attrs != null) {
                mFont = attrs.getAttributeIntValue(
                        "http://schemas.android.com/apk/res-auto", "Lato-Regular.ttf",
                        -1);
            }
            Typeface typeface = getTypeface();
            int typefaceStyle = Typeface.NORMAL;
            if (typeface != null) {
                typefaceStyle = typeface.getStyle();
            }
            if (mFont > FontUtils.FONTS) {
                typefaceStyle = mFont;
            }
            FontUtils.applyFont(this, typefaceStyle);
            fontApplied = true;
        }
    }
}

Тепер, кожного разу, коли користувальницький перегляд тексту дзвонить, і ми отримуватимемо значення атрибута int fontValue = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto","Lato-Regular.ttf",-1).

Або

Ми також можемо отримати getTypeface () з подання, яке ми встановили в нашому xml ( android:textStyle="bold|normal|italic"). Тож роби все, що хочеш робити.

Тепер ми робимо FontUtilsдля встановлення будь-якого шрифту .ttf на наш погляд.

public class FontUtils {

    public static final int FONTS = 1;
    public static final int FONTS_NORMAL = 2;
    public static final int FONTS_BOLD = 3;
    public static final int FONTS_BOLD1 = 4;

    private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>();

    static Typeface getFonts(Context context, String name) {
        Typeface typeface = TYPEFACE.get(name);
        if (typeface == null) {
            typeface = Typeface.createFromAsset(context.getAssets(), name);
            TYPEFACE.put(name, typeface);
        }
        return typeface;
    }

    public static void applyFont(TextView tv, int typefaceStyle) {

        Context cxt = tv.getContext();
        Typeface typeface;

        if(typefaceStyle == Typeface.BOLD_ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }else if (typefaceStyle == Typeface.BOLD || typefaceStyle == SD_FONTS_BOLD|| typefaceStyle == FONTS_BOLD1) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-SemiBold.ttf");
        } else if (typefaceStyle == Typeface.ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Thin.ttf");
        } else {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }
        if (typeface != null) {
            tv.setTypeface(typeface);
        }
    }
}

0

Можливо, буде корисно знати, що, починаючи з Android 8.0 (рівень API 26), ви можете використовувати спеціальний шрифт у XML .

Ви можете застосувати спеціальний шрифт до всієї програми наступним чином.

  1. Помістіть шрифт у папку res/font.

  2. У res/values/styles.xmlвикористанні цього в темі програми. <style name="AppTheme" parent="{whatever you like}"> <item name="android:fontFamily">@font/myfont</item> </style>



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.