Вопрос

Я применил пользовательский шрифт для TextView, но это не так, кажется, не меняет шрифт.

Вот мой код:

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

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

Это было полезно?

Решение

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

Редактировать: Проверил это сам сейчас. Вот решение. Вы можете использовать подпапку под названием fonts, но он должен идти в assets папка не то res папка. Так

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

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

Другие советы

После пробования большинства решений, описанных в этой теме, я случайно обнаружил каллиграфию (https://github.com/chriisjenx/calligraphy.) - библиотека Christopher Jenkins, которая позволяет вам легко добавлять пользовательские шрифты в ваше приложение. Преимущества его Lib, по сравнению с подходами, предложенными здесь:

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

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

Вот простой вид текста:

package com.mycompany.myapp.widget;

/**
 * Text view with a custom font.
 * <p/>
 * 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 файл:

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

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:customAttrs="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.mycompany.myapp.widget.CustomFontTextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="foobar"
         customAttrs:customFont="roboto_thin" />

</RelativeLayout>

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

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

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <!-- This text view is styled with the app theme -->
    <com.innovattic.font.FontTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This uses my font in bold italic style" />

    <!-- This text view is styled here and overrides the app theme -->
    <com.innovattic.font.FontTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:flFont="anotherFont"
        android:textStyle="normal"
        android:text="This uses another font in normal style" />

    <!-- This text view is styled with a style and overrides the app theme -->
    <com.innovattic.font.FontTextView
        style="@style/StylishFont"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This also uses another font in normal style" />

</LinearLayout>

С сопроводительным res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">

    <!-- Application theme -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <item name="android:textViewStyle">@style/MyTextViewStyle</item>
    </style>

    <!-- Style to use for ALL text views (including FontTextView) -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="MyTextViewStyle" parent="@android:style/Widget.Holo.Light.TextView">
        <item name="android:textAppearance">@style/MyTextAppearance</item>
    </style>

    <!-- Text appearance to use for ALL text views (including FontTextView) -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="MyTextAppearance" parent="@android:style/TextAppearance.Holo">
        <!-- Alternatively, reference this font with the name "aspergit" -->
        <!-- Note that only our own TextView's will use the font attribute -->
        <item name="flFont">someFont</item>
        <item name="android:textStyle">bold|italic</item>
    </style>

    <!-- Alternative style, maybe for some other widget -->
    <style name="StylishFont">
        <item name="flFont">anotherFont</item>
        <item name="android:textStyle">normal</item>
    </style>

</resources>

Я создал пару инструментов специально для этой цели. Ссылаться на этот проект от Github или посмотрите на это Сообщение блога что объясняет все это.

Для пользовательских шрифтов в Android создайте папку в рамках папки активов Назовите его «Шрифты» Поместите нужные Fonts.ttf или .otf файл в нем.

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

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

остальное, если расширяет активность:

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

Лучший способ сделать это из Android O Preview Release:

Это работает, только если у вас есть Android Studio-2.4 или выше

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

Далее мы должны создать семью шрифта:

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

Добавление шрифтов в текстовый просмотр:

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

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

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

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

Вы можете использовать Pixlui в https://github.com/neopixl/pixlui.

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

 <com.neopixl.pixlui.components.textview.TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    pixlui:typeface="GearedSlab.ttf" />

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

<TextView
        android:id="@+id/textViewHello1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 1"
        android:tag="fonts/Oswald-Regular.ttf"/>

или это:

<TextView
        android:id="@+id/textViewHello2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 2"
        style="@style/OswaldTextAppearance"/>

<style name="OswaldTextAppearance">
        <item name="android:tag">fonts/Oswald-Regular.ttf</item>
        <item name="android:textColor">#000000</item>
</style>

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

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)

А что за то, что вы спрашиваете магический класс? В основном приклеены из другого, так что посты, с помощниками как для активности, так и фрагментов:

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<String, Typeface> 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;
    }
}

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

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

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

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

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

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

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

Обязательно вставьте вышеуказанный код в OnCreate () после Ваш звонок в супер и вызов на SetContentView (). Эта небольшая деталь сохранила мою виту на некоторое время.

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

Folder Under res with name font and type set to Font

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

Это автоматически генерирует несколько файлов.

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

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

  <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" /> 

3. preloaded_fonts.xml

<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/open_sans_regular</item>
        <item>@font/open_sans_semibold</item>
    </array>
</resources>

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

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

https://github.com/shellum/fontview.

Пример:

<!--Layout-->
<com.finalhack.fontview.FontView
        android:id="@+id/someFontIcon"
        android:layout_width="80dp"
        android:layout_height="80dp" />

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

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

Например:

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

enter image description here

И в вашем приложении тема просто добавьте ее как FontFamily:

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

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

<style name="fontTextView" parent="@android:style/Widget.TextView">
    <item name="android:fontFamily">monospace</item>
</style>

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

<item name="android:textViewStyle">@style/fontTextView</item>

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

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

видеть это связь


Старый ответ

Есть два способа настроить шрифты:

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



Путь 1:Переключение типа .Class ||| лучший способ

Call fontsoverride.setdefaultfont () в классе расширяет приложение, этот код приведет к изменению всех программных шрифтов, даже тосты шрифтов

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

}

Вы можете использовать легко и просто Easyfonts. сторонняя библиотека для установки разнообразных пользовательских шрифтов к вашему TextView. Отказ Используя эту библиотеку, вам не нужно беспокоиться о загрузке и добавлении шрифтов в папку активов / шрифтов. Также о создании объекта шрифта.

Вместо

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

Эта библиотека также обеспечивает следующий шрифт.

  • Робото
  • Droid Serif.
  • Droid Robot
  • Свобода
  • Забавный рейзер
  • Андроидная нация
  • Зеленый авокадо
  • Признание

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

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

Это включает в себя размещение файлов TTF в папке Res / font и создание файла Font-Family.

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

Используйте пользовательский шрифт в XML:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/[your font resource]"/>

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

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

  • Откройте свой проект и выберите Проект наверху слева
  • приложение --> Src. --> основной
  • Щелкните правой кнопкой мыши к главному и созданию каталога Название его как ресурсы
  • Щелкните правой кнопкой мыши, чтобы пристаньте и создать новое имя каталога шрифты
  • Вам нужно найти бесплатные шрифты, такие как Свободные шрифты
  • Дайте его своему текстуслу и позвоните в свой класс активности
  • Скопируйте свои шрифты внутри шрифты папка
  • 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 падать. Если это не там, найдите Caret Thingy (> и нажмите на него, чтобы расширить textAppearance) под.
  3. Развернуть font-family падать.
  4. В маленьком списке прокрутите весь путь вниз, пока не увидите more fonts
  5. Это откроет диалоговое окно, в котором вы можете искать от Google Fonts
  6. Поиск шрифта, который вам нравится с баром поиска на вершине
  7. Выберите свой шрифт.
  8. Выберите стиль шрифта, который вам нравится (IE Bold, Normal, ITalic и т. Д.)
  9. На правой панели выберите «Переключатель, которая говорит Add font to project
  10. Нажмите, хорошо. Теперь ваш TextView имеет шрифт, который вам нравится!

Бонус: если вы хотели бы уделить все с текстом в вашем приложении с выбранным шрифтом, просто добавьте <item name="android:fontfamily">@font/fontnamehere</item> в ваш styles.xml

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top