Как установить семейство шрифтов по умолчанию для всего Android-приложения

Я использую шрифт Roboto light в своем приложении. Чтобы установить шрифт, я должен добавить android:fontFamily="sans-serif-light" для каждого представления. Есть ли способ объявить шрифт Roboto как семейство шрифтов по умолчанию для всего приложения? Я так пробовал, но он, похоже, не работал.

   sans-serif-light  

12 Solutions collect form web for “Как установить семейство шрифтов по умолчанию для всего Android-приложения”

Ответ – да.

Глобальный свет Roboto для classов TextView и Button :

    

Просто выберите стиль, который вы хотите, из списка themes.xml , а затем создайте свой собственный стиль на основе оригинального. В конце применяйте стиль в качестве темы приложения.

   

Он будет работать только со встроенными шрифтами, такими как Roboto, но это был вопрос. Для пользовательских шрифтов (например, загруженных из активов) этот метод не будет работать.

РЕДАКТИРОВАТЬ 08/13/15

Если вы используете темы AppCompat, не забудьте удалить android: prefix. Например:

  

Обратите внимание, что buttonStyle не содержит android: префикс, но textViewStyle должен содержать его.

С выпуском Android Oreo вы можете использовать библиотеку поддержки для достижения этой цели.

  1. Проверьте свое приложение build.gradle, если у вас есть библиотека поддержки > = 26.0.0
  2. Добавьте папку « font » в папку ресурсов и добавьте шрифты туда
  3. Ссылка на семейство шрифтов по умолчанию в главном стиле приложения:

      

Для получения более подробной информации проверьте https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html .

Вы можете использовать каллиграфию для управления шрифтами с Android

https://github.com/chrisjenx/Calligraphy

ПРОЧИТАЙТЕ ОБНОВЛЕНИЕ НИЖЕ

У меня была такая же проблема с встраиванием нового шрифта и, наконец, я получил его для работы с расширением TextView и установкой typefont внутри.

 public class YourTextView extends TextView { public YourTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public YourTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public YourTextView(Context context) { super(context); init(); } private void init() { Typeface tf = Typeface.createFromAsset(context.getAssets(), "fonts/helveticaneue.ttf"); setTypeface(tf); } } 

Вы должны изменить элементы TextView позже, чтобы от каждого элемента. И если вы используете UI-Creator в Eclipse, иногда он не показывает TextViews правильно. Единственное, что работает для меня …

ОБНОВИТЬ

В настоящее время я использую reflection для изменения шрифтов в целом приложении без расширения TextViews. Проверьте это сообщение SO

ОБНОВЛЕНИЕ 2

Начиная с уровня API 26 и доступного в «библиотеке поддержки», вы можете использовать

 android:fontFamily="@font/embeddedfont" 

Дополнительная информация: Шрифты в XML

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

 public class Font { public static void setAllTextView(ViewGroup parent) { for (int i = parent.getChildCount() - 1; i >= 0; i--) { final View child = parent.getChildAt(i); if (child instanceof ViewGroup) { setAllTextView((ViewGroup) child); } else if (child instanceof TextView) { ((TextView) child).setTypeface(getFont()); } } } public static Typeface getFont() { return Typeface.createFromAsset(YourApplicationContext.getInstance().getAssets(), "fonts/whateverfont.ttf"); } } 

Во всей своей деятельности передайте ему текущую ViewGroup после setContentView, и она будет выполнена:

 ViewGroup group = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content); Font.setAllTextView(group); 

Для fragmentа вы можете сделать что-то подобное.

Другой способ сделать это для всего приложения – использовать reflection, основанное на этом ответе

 public class TypefaceUtil { /** * Using reflection to override default typefaces * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE * OVERRIDDEN * * @param typefaces map of fonts to replace */ public static void overrideFonts(Map typefaces) { try { final Field field = Typeface.class.getDeclaredField("sSystemFontMap"); field.setAccessible(true); Map oldFonts = (Map) field.get(null); if (oldFonts != null) { oldFonts.putAll(typefaces); } else { oldFonts = typefaces; } field.set(null, oldFonts); field.setAccessible(false); } catch (Exception e) { Log.e("TypefaceUtil", "Can not set custom fonts"); } } public static Typeface getTypeface(int fontType, Context context) { // here you can load the Typeface from asset or use default ones switch (fontType) { case BOLD: return Typeface.create(SANS_SERIF, Typeface.BOLD); case ITALIC: return Typeface.create(SANS_SERIF, Typeface.ITALIC); case BOLD_ITALIC: return Typeface.create(SANS_SERIF, Typeface.BOLD_ITALIC); case LIGHT: return Typeface.create(SANS_SERIF_LIGHT, Typeface.NORMAL); case CONDENSED: return Typeface.create(SANS_SERIF_CONDENSED, Typeface.NORMAL); case THIN: return Typeface.create(SANS_SERIF_MEDIUM, Typeface.NORMAL); case MEDIUM: return Typeface.create(SANS_SERIF_THIN, Typeface.NORMAL); case REGULAR: default: return Typeface.create(SANS_SERIF, Typeface.NORMAL); } } } 

то всякий раз, когда вы хотите переопределить шрифты, вы можете просто вызвать метод и дать ему карту шрифтов следующим образом:

 Typeface regular = TypefaceUtil.getTypeface(REGULAR, context); Typeface light = TypefaceUtil.getTypeface(REGULAR, context); Typeface condensed = TypefaceUtil.getTypeface(CONDENSED, context); Typeface thin = TypefaceUtil.getTypeface(THIN, context); Typeface medium = TypefaceUtil.getTypeface(MEDIUM, context); Map fonts = new HashMap<>(); fonts.put("sans-serif", regular); fonts.put("sans-serif-light", light); fonts.put("sans-serif-condensed", condensed); fonts.put("sans-serif-thin", thin); fonts.put("sans-serif-medium", medium); TypefaceUtil.overrideFonts(fonts); 

для полной проверки

Это работает только для Android SDK 21 и выше для более ранних версий.

Просто используйте этот lib, скомпилируйте его в своем файле оценки

 complie'me.anwarshahriar:calligrapher:1.0' 

и использовать его в методе onCreate в основной деятельности

 Calligrapher calligrapher = new Calligrapher(this); calligrapher.setFont(this, "yourCustomFontHere.ttf", true); 

Это самый элегантный и быстрый способ сделать это.

Android не обеспечивает многого для поддержки применения шрифтов во всем приложении (см. Эту проблему ). У вас есть 4 варианта установки шрифта для всего приложения:

  • Вариант 1: применить reflection для изменения системного шрифта
  • Вариант 2: создавать и подclassы пользовательских classов View для каждого представления, для которого требуется собственный шрифт
  • Вариант 3: Внедрение поискового искателя, который пересекает иерархию представлений для текущего экрана
  • Вариант4: используйте стороннюю библиотеку.

Подробности этих опций можно найти здесь .

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

 public static void setFont(ViewGroup layout) { final int childcount = layout.getChildCount(); for (int i = 0; i < childcount; i++) { // Get the view View v = layout.getChildAt(i); // Apply the font to a possible TextView try { ((TextView) v).setTypeface(MY_CUSTOM_FONT); continue; } catch (Exception e) { } // Apply the font to a possible EditText try { ((TextView) v).setTypeface(MY_CUSTOM_FONT); continue; } catch (Exception e) { } // Recursively cicle into a possible child layout try { ViewGroup vg = (ViewGroup) v; Utility.setFont(vg); continue; } catch (Exception e) { } } } 

просто установить шрифт приложения в normal , sans serif , serif или monospace (не для пользовательского шрифта!), вы можете это сделать.

определить тему и установить атрибут android:typeface для шрифта, который вы хотите использовать в styles.xml :

     

примените тему к всему приложению в файле AndroidManifest.xml :

 < ?xml version="1.0" encoding="utf-8"?>     

Ссылка на андроид

Попробуйте эту библиотеку, ее легкий и простой в использовании

https://github.com/sunnag7/FontStyler

  

Ответ – нет, вы не можете. См. Можно ли установить собственный шрифт для всего приложения? Чтобы получить больше информации.

Есть обходные пути, но ничто в строках «одной единственной строки кода здесь и всех моих шрифтов не будет».

(Я благодарю Google и Apple за это). У пользовательских шрифтов есть место, но упрощая их замену на приложение, создало бы целый мир приложений Comic Sans )

  • Размытие шрифтов WPF-Решения
  • Использование пользовательского шрифта в Android
  • «Родной шрифт не может быть создан» только для некоторых людей
  • CSS Font Border?
  • Как встраивать шрифты .ttf является JavaFx 2.2?
  • Использование шрифтов с конвейером Rails
  • Пользовательские шрифты и XML-макеты (Android)
  • Создание webfont с дополнительными многоязычными символами плоскости Unicode
  • Правильный MIME-тип для .woff2-шрифтов
  • Тот же шрифт, кроме его веса, выглядит по-разному в разных браузерах
  • Алгоритм реализации облака слов, такого как Wordle
  • Interesting Posts

    Множественные подстановочные знаки для общих методов делают Java-компилятор (и меня!) Очень запутанным

    Как реализовать db-прослушиватель в Java

    JQuery Ajax Проводка json для webservice

    Массивы переменной длины (динамические) в Java

    Ошибка Symlink при установке MySQL через Homebrew

    MySQL ‘Order By’ – сортировка буквенно-цифровых символов

    Получите гиперссылки PDF на iOS с кварцем

    Какие инструменты для статического анализа C ++ с открытым исходным кодом доступны?

    Почему компании блокируют «пинг»?

    Есть ли способ заставить оболочку Windows cmd расширять подстановочные пути?

    Добавить возможности беспроводной сети к существующей сети Ethernet

    Как вызвать переопределенный метод суперclassа?

    Как определить, является ли строка числом?

    Одновременное использование как ADSL, так и LAN

    «Не удалось настроить» цикл перезагрузки с обновлениями Windows 7

    Давайте будем гением компьютера.