Как установить семейство шрифтов по умолчанию для всего 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 )

  • Проблема при использовании пользовательского шрифта - «родной шрифт не может быть создан»
  • Силовой неmonoпольный шрифт в фиксированную ширину с использованием CSS
  • Использование пользовательского шрифта в android TextView с помощью xml
  • Как установить конкретный шрифт для текста кнопки в android?
  • Ярлык для изменения размера шрифта в Eclipse?
  • Можно ли настроить собственный шрифт для всего приложения?
  • Размытие шрифтов WPF-Решения
  • Тот же шрифт, кроме его веса, выглядит по-разному в разных браузерах
  • Таблицы стилей CSS по умолчанию для браузеров
  • Изменение размера шрифта на основе шрифта-семейства с помощью jQuery
  • Не удалось декодировать загруженный шрифт
  • Давайте будем гением компьютера.