Android – Использование пользовательского шрифта

Я применил специальный шрифт к TextView , но, похоже, он не изменяет шрифт.

Вот мой код:

  Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf"); TextView myTextView = (TextView)findViewById(R.id.myTextView); myTextView.setTypeface(myTypeface); 

Может ли кто-нибудь избавить меня от этой проблемы?

На Mobiletuts + есть очень хорошее руководство по форматированию текста для Android. Быстрый совет: настройка шрифтов для Android

EDIT: Протестировал его сам. Вот решение. Вы можете использовать подпапку, называемую шрифтами, но она должна находиться в папке с assets не в папке res . Так

активы / шрифты

Также убедитесь, что окончание шрифта I означает окончание самого файла шрифта – это все в нижнем регистре. Другими словами, это не должно быть myFont.TTF но myfont.ttf этот путь должен быть в нижнем регистре

Попробовав большинство решений, описанных в этом streamе, я случайно нашел «Каллиграфию» ( https://github.com/chrisjenx/Calligraphy ) – библиотеку Кристофера Дженкинса, которая позволяет вам легко добавлять пользовательские шрифты в ваше приложение. Преимущества его lib по сравнению с подходами, предложенными здесь:

  1. вам не нужно вводить свой собственный избыточный компонент TextView, вы используете встроенный TextView
  2. вы можете легко включить библиотеку с помощью gradle
  3. Библиотека не ограничивает выбор шрифтов; вы просто добавляете свои предпочитаемые в активы dir
  4. вы не только получаете пользовательские текстовые представления – все другие текстовые компоненты Android на основе текста также будут отображаться с использованием пользовательского шрифта.

Я знаю, что есть хорошие ответы уже, но вот полноценная работа.

Вот пользовательский текстовый вид:

 package com.mycompany.myapp.widget; /** * Text view with a custom font. * 

* In the XML, use something like {@code customAttrs:customFont="roboto-thin"}. The list of fonts * that are currently supported are defined in the enum {@link CustomFont}. Remember to also add * {@code xmlns:customAttrs="http://schemas.android.com/apk/res-auto"} in the header. */ public class CustomFontTextView extends TextView { private static final String sScheme = "http://schemas.android.com/apk/res-auto"; private static final String sAttribute = "customFont"; static enum CustomFont { ROBOTO_THIN("fonts/Roboto-Thin.ttf"), ROBOTO_LIGHT("fonts/Roboto-Light.ttf"); private final String fileName; CustomFont(String fileName) { this.fileName = fileName; } static CustomFont fromString(String fontName) { return CustomFont.valueOf(fontName.toUpperCase(Locale.US)); } public Typeface asTypeface(Context context) { return Typeface.createFromAsset(context.getAssets(), fileName); } } public CustomFontTextView(Context context, AttributeSet attrs) { super(context, attrs); if (isInEditMode()) { return; } else { final String fontName = attrs.getAttributeValue(sScheme, sAttribute); if (fontName == null) { throw new IllegalArgumentException("You must provide \"" + sAttribute + "\" for your text view"); } else { final Typeface customTypeface = CustomFont.fromString(fontName).asTypeface(context); setTypeface(customTypeface); } } } }

Вот пользовательские атрибуты. Это должно перейти в файл res/attrs.xml :

       

И вот как вы его используете. Я буду использовать относительный макет, чтобы обернуть его и показать декларацию customAttr , но, очевидно, это может быть любой макет, который у вас уже есть.

    

Я успешно использовал это раньше. Единственная разница между нашими реализациями заключается в том, что я не использовал подпапку в активах. Не уверен, что это что-то изменит.

При условии, что вы поместили шрифт в нужное место, и в файле шрифта нет ошибки, ваш код должен работать так, RATTLESNAKE.

Однако было бы намного проще, если бы вы могли просто определить шрифт в вашем макете xml, например:

         

С прилагаемыми res/values/styles.xml :

               

Для этой цели я создал несколько инструментов. Обратитесь к этому проекту из GitHub или посмотрите на это сообщение в блоге, которое объясняет все это.

Для пользовательских шрифтов в android создайте папку в папке с именами активов, она «шрифты» поместит в нее нужный файл fonts.ttf или .otf.

Если вы расширите UIBaseFragment:

 Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Arial.ttf"); tv.setTypeface(font); 

else if extends Activity:

 Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/Arial.ttf"); tv.setTypeface(font); 

Лучший способ сделать это От версии предварительного просмотра Android O такой способ:

Он работает только в том случае, если у вас есть студия Android 2.4 или выше

  1. Щелкните правой кнопкой мыши папку res и выберите « Создать»> «Каталог ресурсов Android» . Новый
    Появится окно каталога ресурсов.
  2. В списке Тип ресурса выберите шрифт и нажмите кнопку ОК.
  3. Добавьте файлы шрифтов в папку шрифтов . Структура папки ниже генерирует R.font.dancing_script , R.font.la_la и R.font.ba_ba .
  4. Дважды щелкните файл шрифта, чтобы просмотреть шрифты файла в редакторе.

Затем мы должны создать семейство шрифтов:

  1. Щелкните правой кнопкой мыши папку шрифтов и выберите « Создать»> «Файл ресурсов шрифта» . Откроется окно «Новый файл ресурсов».
  2. Введите имя файла и нажмите кнопку «ОК» . Новый редактор шрифтов XML открывается в редакторе.
  3. Включите каждый атрибут файла шрифта, стиля и веса в элементе тега шрифта. Следующий XML иллюстрирует добавление атрибутов, связанных шрифтом, в XML-ресурс шрифта:

Добавление шрифтов в TextView:

   

Как из документации

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

Все шаги верны.

Вы можете использовать PixlUI по адресу https://github.com/neopixl/PixlUI

импортируйте их .jar и используйте его в XML

   

Поскольку я не был доволен всеми представленными решениями SO, я придумал свой. Это основано на небольшом трюке с тегами (т. Е. Вы не можете использовать tags в своем коде), я помещаю туда путь шрифта. Поэтому при определении представлений вы можете сделать следующее:

  

или это:

   

Теперь вы можете либо явно получить доступ / настроить представление как:

 TextView textView = TextViewHelper.setupTextView(this, R.id.textViewHello1).setText("blah"); 

или просто настроить все через:

 TextViewHelper.setupTextViews(this, (ViewGroup) findViewById(R.id.parentLayout)); // parentLayout is the root view group (relative layout in my case) 

И какой волшебный class вы спрашиваете? В основном склеивается с других сообщений SO, с вспомогательными методами как для активности, так и для fragmentов:

 import android.app.Activity; import android.content.Context; import android.graphics.Typeface; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.HashMap; import java.util.Map; public class TextViewHelper { private static final Map mFontCache = new HashMap<>(); private static Typeface getTypeface(Context context, String fontPath) { Typeface typeface; if (mFontCache.containsKey(fontPath)) { typeface = mFontCache.get(fontPath); } else { typeface = Typeface.createFromAsset(context.getAssets(), fontPath); mFontCache.put(fontPath, typeface); } return typeface; } public static void setupTextViews(Context context, ViewGroup parent) { for (int i = parent.getChildCount() - 1; i >= 0; i--) { final View child = parent.getChildAt(i); if (child instanceof ViewGroup) { setupTextViews(context, (ViewGroup) child); } else { if (child != null) { TextViewHelper.setupTextView(context, child); } } } } public static void setupTextView(Context context, View view) { if (view instanceof TextView) { if (view.getTag() != null) // also inherited from TextView's style { TextView textView = (TextView) view; String fontPath = (String) textView.getTag(); Typeface typeface = getTypeface(context, fontPath); if (typeface != null) { textView.setTypeface(typeface); } } } } public static TextView setupTextView(View rootView, int id) { TextView textView = (TextView) rootView.findViewById(id); setupTextView(rootView.getContext().getApplicationContext(), textView); return textView; } public static TextView setupTextView(Activity activity, int id) { TextView textView = (TextView) activity.findViewById(id); setupTextView(activity.getApplicationContext(), textView); return textView; } } 

К сожалению, для этого нет хорошего решения.

Я видел много статей об использовании пользовательского TextView, но то, что они забывают, что не только текстовые представления, которые могут реализовывать шрифты, но и скрытые скрытые в других представлениях, недоступные разработчику; Я даже не собираюсь начинать с Spannable .

Вы можете использовать внешнюю утилиту шрифта, например:

Инструмент шрифта каллиграфии

BUT. Этот цикл охватывает все виды приложения в его создании, и даже эта утилита пропускает некоторые виды (ViewPager отображает обычный шрифт), тогда у вас есть проблема, когда Google обновляет свои инструменты сборки, из-за чего они иногда вылетают из-за сбоя, поскольку для этого требуется переназначить устаревшие свойства. Он также немного медленный, поскольку он использует reflection Java .

Это действительно зависит от Google, чтобы это исправить. Нам нужна лучшая поддержка шрифтов в Android. Если вы посмотрите на решение от iOS, у них буквально есть 100 шрифтов, встроенных для выбора. Хотите шрифт? Просто бросьте TFF, и он будет полезен ..

На данный момент теперь ограничено предложение, которое Google предлагает нам, который крайне ограничен, но, к счастью, оптимизирован для мобильных устройств.

Обязательно вставьте вышеуказанный код в onCreate () после вашего вызова супер и вызов setContentView (). Эта небольшая деталь удерживала меня на некоторое время.

С помощью Android 8.0 с использованием пользовательских шрифтов в приложении стало легко downloadable fonts . Мы можем добавлять шрифты непосредственно в res/font/ folder проекта, и при этом шрифты становятся автоматически доступными в Android Studio.

Папка под res с именем шрифта и шрифтом, установленным в Font

Теперь установите атрибут fontFamily в список шрифтов или нажмите еще раз и выберите шрифт по вашему выбору. Это добавит в tools:fontFamily="@font/your_font_file" .

Это автоматически создаст несколько файлов.

1. В папке значений создаст fonts_certs.xml .

2. В манифесте он добавит следующие строки:

   

3. preloaded_fonts.xml

   @font/open_sans_regular @font/open_sans_semibold   

У меня была та же проблема, TTF не появился. Я изменил файл шрифта, и с тем же кодом он работает.

Если вы хотите загрузить шрифт из сети или легко стилизовать его, вы можете использовать:

https://github.com/shellum/fontView

Пример:

   //Java: fontView.setupFont("http://blah.com/myfont.ttf", true, character, FontView.ImageType.CIRCLE); fontView.addForegroundColor(Color.RED); fontView.addBackgroundColor(Color.WHITE); 

Ну, через семь лет вы можете полностью изменить весь textView приложения textView или что хотите, используя библиотеки android.support 26 ++.

Например:

Создайте приложение / src / res / font пакета шрифтов и переместите в него свой шрифт.

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

И в теме приложения просто добавьте его как fontFamily:

   

Пример использования только с textView :

  

И добавьте в свою основную тему:

 @style/fontTextView 

В настоящее время он работает с 8.1 до 4.1 API Jelly Bean. И это широкий диапазон.

Обновите ответ: Android 8.0 (API-уровень 26) представляет новую функцию, Шрифты в XML. просто используйте функцию «Шрифты в XML» на устройствах под управлением Android 4.1 (API-уровень 16) и выше, используйте библиотеку поддержки 26.

посмотреть ссылку


Старый ответ

Существует два способа настройки шрифтов:

!!! мой пользовательский шрифт в активах / fonts / iran_sans.ttf

Путь 1: Refrection Typeface.class

лучший способ

вызов FontsOverride.setDefaultFont () в classе extends Application, этот код приведет к изменению всех шрифтов программного обеспечения, даже шрифтов Toasts

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 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; } } 

Вы можете использовать легкую и простую библиотеку сторонних разработчиков EasyFonts для настройки множества пользовательских шрифтов в TextView . Используя эту библиотеку, вам не придется беспокоиться о загрузке и добавлении шрифтов в папку assets / fonts. Также о создании объекта Typeface.

Вместо

 Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf"); TextView myTextView = (TextView)findViewById(R.id.myTextView); myTextView.setTypeface(myTypeface); 

Просто:

 TextView myTextView = (TextView)findViewById(R.id.myTextView); myTextView.setTypeface(EasyFonts.robotoThin(this)); 

Эта библиотека также предоставляет следующую грань шрифта.

  • Roboto
  • Droid Serif
  • Droid Robot
  • свобода
  • Fun Raiser
  • Android Nation
  • Зеленый авокадо
  • признание

Я автор этой библиотеки.

Правильный способ сделать это с API 26 описан в официальной документации здесь:

https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

Это включает размещение файлов ttf в папке res / font и создание файла семейства шрифтов.

Самое простое решение для Android, поддерживаемое сейчас!

Использовать собственный шрифт в xml:

  

посмотреть подробности:

https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

  • Откройте проект и выберите « Проект» в верхнем левом углу
  • app -> src -> main
  • щелкните правой кнопкой мыши на главную и создайте имя каталога как активы
  • щелкните правой кнопкой мыши, чтобы оценить и создать новое имя каталога, это шрифты
  • вам нужно найти бесплатные шрифты, такие как бесплатные шрифты
  • отправьте его в Textview и вызовите его в своем classе Activity
  • скопируйте шрифты в папку шрифтов
  • TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Aramis Italic.ttf"); txt.setTypeface(font);

имя шрифта должно быть правильным и иметь удовольствие

Да, загружаемые шрифты настолько просты, как сказал Дипали .

Вот как вы это делаете …

  1. Поместите TextView .
  2. В области свойств выберите раскрывающийся список fontFamily . Если его нет, найдите каретку (> и нажмите на нее, чтобы развернуть textAppearance ) под.
  3. Разверните семейство font-family .
  4. В маленьком списке прокрутите весь путь вниз, пока не увидите more fonts
  5. Это откроет диалоговое окно, в котором вы можете искать из Google Fonts
  6. Поиск шрифта, который вам нравится, с панелью поиска вверху
  7. Выберите свой шрифт.
  8. Выберите стиль шрифта, который вам нравится (т. Е. Жирный, нормальный, курсив и т. Д.).
  9. На правой панели выберите переключатель, который добавит Add font to project
  10. Нажмите «ОК». Теперь у вашего TextView есть шрифт, который вам нравится!

БОНУС: Если вы хотите стилизовать ВСЕ с текстом в своем приложении с выбранным шрифтом, просто добавьте @font/fontnamehere в ваши styles.xml

  • Могу ли я подчеркнуть текст в макете Android?
  • Как программно настроить шрифт для шрифтов Spinner?
  • android - установить шрифт на платформу Android без root
  • Изменение размера шрифта на основе шрифта-семейства с помощью jQuery
  • Как встраивать шрифты .ttf является JavaFx 2.2?
  • Android: хотите установить пользовательские шрифты для всего приложения, а не для исполнения
  • Как импортировать шрифт?
  • Шрифт подсказки пароля в Android
  • Как разместить веб-шрифты google на моем собственном сервере?
  • Есть ли способ программно определить, имеет ли файл шрифта определенный Unicode Glyph?
  • Включить или импортировать веб-шрифты Google Web Fonts?
  • Давайте будем гением компьютера.