Android - Использование Пользовательского Шрифта


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

вот мой код:

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

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

21 251

21 ответ:

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

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

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

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

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

  1. вам не нужно вводить свой собственный переопределенный компонент TextView, вы используете встроенный TextView
  2. вы можете легко включить библиотеку использование gradle
  3. библиотека не ограничивает ваш выбор шрифтов; вы просто добавляете свои предпочтительные шрифты в assets dir
  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 file:

<?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>

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

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

однако, было бы намного проще, если бы вы могли просто определить шрифт в вашем макете 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 создайте папку в папке assets имя "шрифты" поместите нужные шрифты.ТТФ или .файл 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. щелкните правой кнопкой мыши папку res и перейти к новый > каталог ресурсов Android. Новый
    Откроется окно каталог ресурсов.
  2. в списке тип ресурса, выберите шрифт, а затем нажмите кнопку ОК.
  3. добавить шрифт файлы в папке шрифта.Структура папок ниже генерирует R.font.dancing_script,R.font.la_la и R.font.ba_ba.
  4. дважды щелкните значок файл шрифта для предварительного просмотра шрифтов в файл в Редакторе.

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

  1. щелкните правой кнопкой мыши папку шрифтов и перейти к New > Font resource file. Откроется окно новый файл ресурсов.
  2. введите имя файла, а затем нажмите кнопку ОК. В Редакторе откроется новый XML-ресурс шрифта.
  3. заключите каждый файл шрифта, стиль и вес атрибута в элементе тега font. Следующий XML иллюстрирует добавление атрибутов, связанных с шрифтом, в XML ресурса шрифта:

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

   <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" />

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

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

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

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

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

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

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

Шрифт Каллиграфия Инструмент

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

Это действительно до Google, чтобы исправить это. Нам нужна лучшая поддержка шрифтов в Андроид. Если вы посмотрите на решение от 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" строку TextView.

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

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++.

например:

создайте свой пакет шрифтов app / 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 26) вводит новую функцию, шрифты в XML. просто используйте функцию шрифты в XML на устройствах под управлением Android 4.1 (уровень API 16) и выше, используйте библиотеку поддержки 26.

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


ответ

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

!!! мой пользовательский шрифт в активы/шрифты/iran_sans.ТТФ



Способ 1 : Refrection Шрифт.класс||/лучший способ

вызов 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;
    }

}

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

вместо

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
  • дроид Засечка
  • Робота-Дроида
  • свободы
  • 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:

<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

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

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

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

вот как вы это делаете...

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

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