Як встановити спеціальний шрифт для цілої програми в Android?


83

Чи можна встановити власний шрифт у програмі Android?

Я спробував те, що розміщено тут , але я не знаю, де мій extends Applicationклас ...

Будь-яка допомога?

РЕДАГУВАТИ:

Я спробував наступне:

  • Додайте папку активів і вставте шрифт всередину, як показано тут:

введіть тут опис зображення

  • Додайте новий клас, що поширюється на Application

  • Зателефонуйте до цього нового класу з мого AndroidManifest.xml.

  • Я підійшов до свого стилю і додав його.

MyApp.java:

public class MyApp extends Application {
  @Override
  public void onCreate() {
     super.onCreate();
    FontsOverride.setDefaultFont(this, "DEFAULT", "raleway_regular.ttf");
    //  This FontsOverride comes from the example I posted above
  }
  }

AndroidManifest.xml:

<application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:name=".MyApp"
      android:theme="@style/AppTheme">
     ....

styles.xml:

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:fontFamily">default</item>
 </style>

Але мій шрифт все ще не змінюється ... будь-яка ідея?

Потім MyAppвикликається клас. Але ніякого впливу на мої шрифти ...

EDIT2: Я зрозумів, що мої кнопки застосовують спеціальний шрифт після того, як я встановив власний стиль для своїх кнопок. Ось мій власний стиль кнопок:

<style name="MyButtonStyle" parent="Widget.AppCompat.Button">
    <item name="textAllCaps">false</item>
    <item name="android:textAllCaps">false</item>
</style>

І ось як це виглядає зараз:

введіть тут опис зображення

Отже: моя кнопка застосовує стиль, але не TextView. Будь-яка ідея про те, чому мій спеціальний шрифт застосовується не до всіх елементів програми?


посилання, яке ви вказали, справді корисне для вашої проблеми.
Androider

Я знаю, я думаю, що моє рішення є ... Але коли я створюю клас, який поширюється на Application, я не можу змусити його працювати, оскільки він говорить, що мій клас ніколи не використовується ...
Sonhja

перевірте ще кілька посилань у моїй відповіді, здається корисним, ще одна річ, моє перше посилання справді краще, дякую
Androider

Відповіді:


50

Напишіть клас

public class MyApp extends Application{
// Put the onCreate code as you obtained from the post link you reffered
}

тепер наступна річ - в AndroidManifest.xml, щоб тег програми дав назву класу програми. У цьому випадку це MyApp

<application
android:name=".MyApp"
...
>
...
</application>

Отже, кожного разу, коли додаток відкривається, буде викликаний метод onCreate класу MyApp і встановлено шрифт.

Оновлення Помістіть файл шрифту під assets / fonts / your_font_file.ttf

Помістіть цей рядок під метод onCreate вашого класу програми (MyApp)

TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/your_font_file.ttf");

Вихідний файл для TypefaceUtil

public class TypefaceUtil {

    /**
     * Using reflection to override default typeface
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
     *
     * @param context                    to work with assets
     * @param defaultFontNameToOverride  for example "monospace"
     * @param customFontFileNameInAssets file name of the font from assets
     */
    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {

        final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Map<String, Typeface> newMap = new HashMap<String, Typeface>();
            newMap.put("serif", customFontTypeface);
            try {
                final Field staticField = Typeface.class
                        .getDeclaredField("sSystemFontMap");
                staticField.setAccessible(true);
                staticField.set(null, newMap);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            try {
                final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
                defaultFontTypefaceField.setAccessible(true);
                defaultFontTypefaceField.set(null, customFontTypeface);
            } catch (Exception e) {
                Log.e(TypefaceUtil.class.getSimpleName(), "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
            }
        }
    }
}

Тепер оновіть файл style.xml

поставте внизу рядок свій стиль, який включений для вашої діяльності у файл маніфесту

  <item name="android:typeface">serif</item>

Сподіваюся, це допомагає


Будь ласка, повідомте мені вашу версію ОС Android, на якій ви тестуєте. Я зауважив, що в льодянику нам потрібно зробити ще кілька твіків
Нітін Места

Будь ласка , перевірте посилання на рішення для льодяника і попередніх версії Android: ( stackoverflow.com/a/36206275/2268466 )
BlueWare

він змінює шрифт усіх додатків у тостовому повідомленні, діалоговому вікні попередження, я не хочу користувацький спеціальний шрифт у цьому
Аділ,

1
У мене є сумніви: багато виробників дозволяють користувачеві змінювати шрифти загальносистемно з налаштувань. Чи змінюється ця зміна також на наш тип шрифту, який ми встановлюємо програмно?
Bhuro

А як щодо встановлення декількох шрифтів?
Gaurav Mandlik

82

РЕДАГУВАТИ

uk.co.chrisjenx:calligraphyLib більше не підтримується для останньої версії Android, альтернатива тепер https://github.com/InflationX/Calligraphy

dependencies {
    implementation 'io.github.inflationx:calligraphy3:3.1.1'
    implementation 'io.github.inflationx:viewpump:2.0.3'
}

Додайте власні шрифти до ресурсів /

Використання

Для шрифту за замовчуванням

Визначте шрифт за замовчуванням, використовуючи CalligraphyConfig, у класі вашого застосунку в методі #onCreate () та передайте його CalligraphyInterceptor, який ви додаєте до конструктора ViewPump.

@Override
public void onCreate() {
    super.onCreate();
    ViewPump.init(ViewPump.builder()
        .addInterceptor(new CalligraphyInterceptor(
                new CalligraphyConfig.Builder()
                    .setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf")
                    .setFontAttrId(R.attr.fontPath)
                    .build()))
        .build());
    //....
}

Вводити в контекст: Оберніть контекст діяльності:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
}

Нестандартний стиль

<style name="TextViewCustomFont">
    <item name="fontPath">fonts/RobotoCondensed-Regular.ttf</item>
</style>

Для теми

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>

<style name="AppTheme.Widget"/>

<style name="AppTheme.Widget.TextView" parent="android:Widget.Holo.Light.TextView">
    <item name="fontPath">fonts/Roboto-ThinItalic.ttf</item>
</style>

Більше не підтримується розробниками нижче рішення


В андроїді є чудова бібліотека для користувальницьких шрифтів: Каліграфія
Ось зразок, як нею користуватися.

У Gradle вам потрібно вставити цей рядок у файл build.gradle вашого додатка:

        dependencies {
            compile 'uk.co.chrisjenx:calligraphy:2.2.0'
        }

А потім створіть клас, який розширює Application, і напишіть такий код:

        public class App extends Application {
            @Override
            public void onCreate() {
                super.onCreate();

                CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                                .setDefaultFontPath("your font path")
                                .setFontAttrId(R.attr.fontPath)
                                .build()
                );
            }
        } 

Ви повинні були зробити для активів / "Новий каталог" "шрифти" (див. Нижче), тому в цьому коді "шлях до вашого шрифту" повинен бути "шрифти / SourceSansPro-Regular.ttf". (Це просто "шрифти ...", а не "/ шрифти .." або "активи ..")

А в класі активності поставте цей метод перед onCreate:

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

І останнє, що ваш файл маніфесту повинен виглядати так:

        <application
           .
           .
           .
           android:name=".App">

І це змінить всю діяльність на ваш шрифт! це просто і чисто!

На Активах слід клацнути правою кнопкою миші Новий каталог, назвати його "шрифти". У шукач помістіть .ttfтуди файли шрифтів.

введіть тут опис зображення

Також не забудьте додати нижче двох рядків у attrs.xml, якщо у вас немає файла attrs.xml, створіть новий файл у values.xml

 <attr format="string" name="fontPath"/> 
    <item name="calligraphy_tag_id" type="id"/>

Я використовую ttf, але я майже впевнений, що .otf також буде працювати і найкраще розташувати його в папці "активи".
Раджеш Насіт,

Помістіть це в розширений клас програми CalligraphyConfig.initDefault (новий CalligraphyConfig.Builder () .setDefaultFontPath ("шрифти / GOTHAM-MEDIUM.ttf") .setFontAttrId (R.attr.fontPath) .build ()); Також не забудьте додати нижче двох рядків у values.xml <attr format = "string" name = "fontPath" /> <item name = "calligraphy_tag_id" type = "id" />
Раджеш Насіт

привіт @rajesh! слід натиснути "Редагувати" і додати це до своєї чудової відповіді! Ви маєте рацію, це повинні бути файли .ttf , вибачте.
Fattie,

1
Ви можете використовувати фрагмент якомога більше. Тож кількість активності буде зменшена.
Rajesh Nasit

1
@Pawan, щоб зробити це одним кроком - я визначаю простий базовий клас, де attachBaseContext(..)реалізовано, а потім усі мої класи активності проекту (де я хочу цей спеціальний шрифт) розширюють цей базовий клас
Gene Bo,

65

Все, що я зробив, це:

1: Додано "новий каталог ресурсів" до папки RES, Вибраний ТИП РЕСУРСУ як "шрифт" із розкривного меню, названо новий каталог "шрифт" та збережено. НОВИЙ КАТАЛОГ РЕСУРСІВ

2: Додав мій "custom_font.ttf" до щойно створеної папки FONT.

3: Додано мій власний шрифт до базової теми програми в STYLES.XML

СТИЛІ.XML

ГОТОВО.


4
Вам також потрібно створити сімейство шрифтів. Після цього це спрацювало у мене. Деталі тут: developer.android.com/guide/topics/ui/look-and-feel/…
keybee

це працювало для мене, не створюючи сімейства шрифтів. Однак мені довелося використовувати версію Gradle> 3 та побудувати інструменти та підтримку бібліотек, встановлених на 27> @keybee
Numanqmr

У мене чудово працювало навіть без сімейства шрифтів
Джуліан Альберто

ви знаєте, як програмно це змінити?
majov,

@majov перевірте відповідь вище #Rajeesh. це має вам допомогти!
Numanqmr

12

Ви можете зробити це з Android SDK тепер як Android Developer офіційного каналу на YouTube , опублікованому в комплекті / 2017 році тут .

Потрібен API рівня 26 (Android 8 Oreo) і вище.

Вам просто потрібно помістити файл шрифту в res/fontпапку та посилатися на них TextViewу випадку, якщо вам потрібен конкретний файл із android:fontFamilyатрибутом.

Якщо вам потрібен базовий шрифт для всього вашого додатка, просто поставте

<item name="android:fontFamily">@font/yourfontname</item> 

у вашому styles.xml

Ви можете завантажити спеціальний шрифт з Android Studio і в дорозі, якщо хочете. Все це ви можете знайти з деталями на відео вище.


Цей параметр призначений для API 26 і вище. Not 16+
Perfect Square

як щодо виправлення для API 23 +?
Raju yourPepe

12

Android пропонує простіші та найкращі рішення, які підтримуються на рівні API 14 бібліотекою підтримки 26+. Шрифти в XML Він також підтримує опцію сімейства шрифтів . Необхідний імпорт: implementation "com.android.support:support-compat:<26+ version>"

Дотримуйтесь цих простих кроків, і сімейство шрифтів буде застосовано до вашого додатку без будь-яких перешкод:

  1. Створіть каталог шрифтів всередині res
  2. Вставте файл шрифтів у шрифт
  3. Клацніть правою кнопкою миші папку шрифтів і перейдіть до New> Font resource file. З'явиться вікно Новий файл ресурсу.
  4. Додайте наступні атрибути
<?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/lobster_regular" />
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/lobster_italic" />
</font-family>
  1. У файлі xml вище. Використовуйте програму лише для використання бібліотеки підтримки. В іншому випадку ви можете використовувати android, якщо ваш додаток націлений на рівень API 26+.
  2. Тепер перейдіть до вашого styles.xml і поставте під рядком основний стиль.
    <item name="android:fontFamily">@font/opensans</item>
    
  3. Важливо: Використовуйте AppCompatActivity лише у тому випадку, якщо ви використовуєте бібліотеку підтримки.
  4. Або скористайтесь наведеним нижче програмним шрифтом

    view.setTypeface(ResourcesCompat.getFont(context, R.font.opensans));
    

Цей спосіб підходить для поточної функції Android Font Resource. Дякую.
azwar_akbar

2

Здається, ви використовуєте, android:fontFamilyа не android:typefaceу своєму styles.xml.

Спробуйте замінити

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:fontFamily">default</item>
</style>

з

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:typeface">default</item>
</style>

1
І як я можу зв’язати це з моєю програмою? Хто поширюється на це?
Sonhja

Ну, розширюючи, Applicationви просто створюєте підклас класу вашого додатка Application. Отже, вам не потрібно його підключати.
Сухас

Що говорить про те, що він ніколи не використовується?
Сухас

Ви також додали <item name="android:typeface">default</item>рядок всередині файлу <style name="AppTheme" parent="AppBaseTheme">вашого додатка, res -> values -> styles.xmlяк було запропоновано в тому ж повідомленні SO?
Сухас

Так, і це теж не працює. Це саме те, що я помістив у своєму редагуванні ... :(
Sonhja

2

Якщо ви дотримуєтесь першої теми, це має спрацювати: тут

Так із роздумами. Це працює ( на основі цієї відповіді ):

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

import java.lang.reflect.Field;
import android.content.Context;
import android.graphics.Typeface;

public final class FontsOverride {

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

protected 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();
    }
}
}

Потім потрібно перевантажити кілька шрифтів за замовчуванням, наприклад, у класі програми:

public final class Application extends android.app.Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
        FontsOverride.setDefaultFont(this, "MONOSPACE", "MyFontAsset2.ttf");
        FontsOverride.setDefaultFont(this, "SERIF", "MyFontAsset3.ttf");
        FontsOverride.setDefaultFont(this, "SANS_SERIF", "MyFontAsset4.ttf");
    }
}

Або, звичайно, якщо ви використовуєте той самий файл шрифту, ви можете вдосконалити його, щоб завантажити його лише один раз.

Однак я схильний просто перевизначити один, скажімо "MONOSPACE", а потім встановити стиль, щоб змусити цю програму шрифтового шрифту широко використовувати:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:typeface">monospace</item>
    </style>
</resources>

API 21 Android 5.0

Я дослідив звіти в коментарях про те, що це не працює, і, здається, він несумісний з темою android: Theme.Material.Light.

Якщо ця тема для вас не важлива, використовуйте стару тему, наприклад:

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:typeface">monospace</item>
</style>

2
  1. На початку ви повинні клацнути правою кнопкою миші на ресурсах вашого проекту, ім'я яких resпотім виберіть із newопції Android Resource Directoryта виберіть fontформу Resource typeта натисніть OK, це створить каталог шрифтів для розміщення ваших шрифтів у ньому.

введіть тут опис зображення

  1. Помістіть .ttfтуди файли шрифтів.

введіть тут опис зображення

  1. Перейдіть до файлу стилю проекту, який існує в наступному шляху, res/values/styles.xml і додайте такі стилі:

    <style name="SansSerifFont">
        <item name="android:fontFamily">sans-serif</item>
    </style>
    
    <style name="OpenSansFont">
        <item name="android:fontFamily">@font/open_sans</item>
    </style>
    
    <style name="IranianSansFont">
        <item name="android:fontFamily">@font/iranian_sans</item>
    </style>
    
    <style name="BYekanFont">
        <item name="android:fontFamily">@font/b_yekan</item>
    </style>
    
    <style name="DroidArabicFont">
        <item name="android:fontFamily">@font/droid_arabic</item>
    </style>
    
  2. Перейдіть до свого коду та напишіть такий клас для зміни цілого шрифту програми:

    public class AppFontManager {
    
        private AppCompatActivity appCompatActivity;
    
        public static final String SANS_SERIF_APP_FONT = "sans_serif";
        public static final String B_YEKAN_APP_FONT = "b_yekan";
        public static final String DROID_ARABIC_APP_FONT = "droid_arabic";
        public static final String IRANIAN_SANS_APP_FONT = "iranian_sans";
        public static final String OPEN_SANS_APP_FONT = "open_sans";
    
        public AppAppearanceManager(AppCompatActivity appCompatActivity) {
            this.appCompatActivity = appCompatActivity;
        }
    
        public void setFont(String fontName){
    
            switch (fontName){
    
                case SANS_SERIF_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.SansSerifFont, true);
                    break;
                }
    
                case B_YEKAN_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.BYekanFont, true);
                    break;
                }
    
                case DROID_ARABIC_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.DroidArabicFont, true);
                    break;
                }
    
                case IRANIAN_SANS_APP_FONT:{
                appCompatActivity.getTheme().applyStyle(R.style.IranianSansFont, true);
                    break;
                }
    
                case OPEN_SANS_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.OpenSansFont, true);
                    break;
                }
            }
        }
    }
    

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

  3. Потім викликайте метод класу перед активністю onCreate super.onCreate(savedInstanceState):

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        new AppAppearanceManager(this).setFont(APP_DEFAULT_FONT);
        super.onCreate(savedInstanceState);
    // Do you stuff there...
    }
    

    Пам'ятайте, що якщо ви хочете змінити шрифт під час виконання , напишіть вибраний шрифт у SharedPreferencesабо ін., А потім передайте вибраний шрифт усім діям, setFontяк описано вище.


1

Створіть папку активів у головній папці. Додайте до неї папку шрифтів. додайте свій файл .ttf у папку шрифтів.

Додайте в тему додатка наступне:

 <item name="android:fontFamily">@font/roboto_regular</item>
    <item name="fontFamily">@font/roboto_regular</item>

Створіть клас як TypefaceUtil

 import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;

import java.lang.reflect.Field;

public class TypefaceUtil {

    /**
     * Using reflection to override default typeface
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
     * @param context to work with assets
     * @param defaultFontNameToOverride for example "monospace"
     * @param customFontFileNameInAssets file name of the font from assets
     */
    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
        try {
            final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

            final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
            defaultFontTypefaceField.setAccessible(true);
            defaultFontTypefaceField.set(null, customFontTypeface);
        } catch (Exception e) {
            Log.e("Can not set","Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
        }
    }
}

Зателефонуйте йому в класі програми або в програмі Launcher

        TypefaceUtil.overrideFont(getApplicationContext(), "fonts/roboto_regular.ttf", "fonts/roboto_regular.ttf"); // font from assets: "assets/fonts/Roboto-Regular.ttf

0

По-перше, створіть новий клас, який замінює будь-який вигляд, який ви хочете налаштувати. (наприклад, хочете кнопку із власним шрифтом? Розширити Button). Наприклад:

public class CustomButton extends Button {
    private final static int ROBOTO = 0;
    private final static int ROBOTO_CONDENSED = 1;

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

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        parseAttributes(context, attrs); //I'll explain this method later
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        parseAttributes(context, attrs);
    }
}

Тепер, якщо у вас його немає, додайте XML-документ res/values/attrs.xmlі додайте:

<resources>
    <!-- Define the values for the attribute -->
    <attr name="typeface" format="enum">
        <enum name="roboto" value="0"/>
        <enum name="robotoCondensed" value="1"/>
    </attr>

    <!-- Tell Android that the class "CustomButton" can be styled, 
         and which attributes it supports -->
    <declare-styleable name="CustomButton">
        <attr name="typeface"/>
    </declare-styleable>
</resources>

Гаразд, так що з цього, що не в дорозі, повернемось до parseAttributes()методу з раніше:

private void parseAttributes(Context context, AttributeSet attrs) {
    TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.CustomButton);

    //The value 0 is a default, but shouldn't ever be used since the attr is an enum
    int typeface = values.getInt(R.styleable.CustomButton_typeface, 0);

    switch(typeface) {
        case ROBOTO: default:
            //You can instantiate your typeface anywhere, I would suggest as a 
            //singleton somewhere to avoid unnecessary copies
            setTypeface(roboto); 
            break;
        case ROBOTO_CONDENSED:
            setTypeface(robotoCondensed);
            break;
    }

    values.recycle();
}

Тепер все готово. Ви можете додати більше атрибутів про що завгодно (ви можете додати ще один для typefaceStyle - жирний, курсив тощо), але тепер давайте подивимося, як це використовувати:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.yourpackage.name"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.yourpackage.name.CustomButton
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me!"
        custom:typeface="roboto" />

</LinearLayout>

xmlns:customЛінія дійсно може бути що завгодно, але угода є те , що показано вище. Важливо те, що він унікальний, і саме тому використовується назва пакета. Тепер ви просто використовуєте custom:префікс для своїх атрибутів та android:префікс для атрибутів android.

І останнє: якщо ви хочете використовувати це в стилі ( res/values/styles.xml), ви повинні НЕ додати xmlns:customрядок. Просто посилайтеся на ім'я атрибута без префікса:

<style name="MyStyle>
    <item name="typeface">roboto</item>
</style>

0

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

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

Удачі


Так .. можливо. У будь-якому випадку, повідомте нам, якщо ви знайшли причину цієї проблеми. Будемо дуже вдячні. Я не міг знайти рішення, навіть читаючи базові коди.
Кейван Есбаті,

0

Спробуйте нижче код, він працює для мене, сподіваюся, це допоможе і вам.

public class BaseActivity extends AppCompatActivity {

private Typeface typeace;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    typeace = Typeface.createFromAsset(getAssets(), getResources().getString(R.string.font_name));
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    overrideFonts(this,getWindow().getDecorView());
}

private void overrideFonts(final Context context, final View v) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideFonts(context, child);
         }
        } else if (v instanceof TextView) {
            ((TextView) v).setTypeface(typeace);
        } else if (v instanceof EditText ) {
            ((EditText) v).setTypeface(typeace);
        } else if (v instanceof Button) {
            ((Button) v).setTypeface(typeace);
        }
    } catch (Exception e) {
 }
 }
}

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

Примітка: - Якщо ви хочете встановити деякі види подання різними шрифтами, вам доведеться встановити це програмно, як показано нижче

private Typeface typeface;
typeface = Typeface.createFromAsset(getAssets(), getResources().getString(R.string.font_name_bold));
tvUserName.setTypeface(typeface);

Тож спробуйте і дайте мені знати, якби я міг допомогти вам далі


0

Це буде робота навколо котліна

Суть рішення https://gist.github.com/Johnyoat/040ca5224071d01b3f3dfc6cd4d026f7

Крок перший

Помістіть файл шрифту під assets / fonts / your_font_file.ttf і створіть клас kotlin під назвою TypeFaceUtil

   class TypefaceUtil{

    fun overridefonts(context: Context, defaultFontToOverride:String, customFontFileNameInAssets:String){
        try {
            val customTypeface = Typeface.createFromAsset(context.assets,customFontFileNameInAssets)
            val defaultTypefaceField = Typeface::class.java.getDeclaredField(defaultFontToOverride)
            defaultTypefaceField.isAccessible = true
            defaultTypefaceField.set(null,customTypeface)
        }catch (e:Exception){
            Timber.e("Cannot set font $customFontFileNameInAssets instead of $defaultFontToOverride")
        }
    }
}

Крок другий Потім у вашому наonCreate

val typefaceUtil = TypefaceUtil()

typefaceUtil.overridefonts(this,"SERIF","fonts/font_file.ttf")

Крок третій

додайте це у свій стиль

<item name="android:typeface">serif</item>

0

Назви шрифтів мають бути малими, щоб їх можна було відображати у програмі та роботі.

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