Внешний шрифт Android для полного приложения

Я хочу изменить шрифт моего полного приложения! Но я не знаю, как получить доступ ко всему приложению. У меня есть способ доступа к тексту по Id, как я могу изменить код для доступа ко всему приложению?

public class ExternalFont extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     String fontPath = "fonts/FreeUniversal-Regular.ttf";
     TextView txtUniversal = (TextView) findViewById(R.id.universal);
     Typeface tf = Typeface.createFromAsset(getAssets(), fontPath);
     txtUniversal.setTypeface(tf);
 }

}

4 ответа

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

      `<style name="customTextVeiw" parent="Widget.MaterialComponents.TextView">
<item name"fontFamilt">@font/custom_free_universal_regular</item>`

затем добавьте этот стиль в файл style.xml внутри стиля AppTheme.

      `<style name="AppTheme" parent="AppBaseTheme">
<item name="android:textViewStyle">@style/customTextVeiw</item>`

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

  • Щелкните правой кнопкой мыши папку res и выберите «Создать»> «Каталог ресурсов Android». Откроется окно «Новый каталог ресурсов».
  • В списке Тип ресурса выберите шрифт и нажмите кнопку ОК.
  • Добавьте файлы шрифтов в папку шрифтов, например, этот free_universal_regular.ttf, вы должны начинать свой шрифт с меньшим и меньшим счетом вместо -.

Создание семейства шрифтов

  • Щелкните правой кнопкой мыши папку шрифтов и выберите «Создать»> «Файл ресурсов шрифта». Откроется окно «Новый файл ресурсов».

  • Введите имя файла, например: custom_free_universal_regular.xml, а затем нажмите OK. В редакторе откроется новый ресурс шрифта XML.

  • добавьте это в файл custom_free_universal_regular.xml.

    <?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android"> <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/free_universal_regular" /> </font-family>

Теперь мы можем использовать это семейство шрифтов в любом месте нашего приложения, например, например, для всех приложений используйте его внутри style.xml. <style name="BaseTheme" parent=""> <item name="fontFamily">@font/custom_free_universal_regular</item> или в конкретном элементе используйте его так <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/custom_free_universal_regular"/>

Надеюсь, это могло помочь.

К сожалению, не существует прямого способа, которым вы можете изменить гарнитуру всех TextViews, которые вы используете в своем приложении, просто изменив гарнитуру по умолчанию.

Что вы можете сделать, так это создать свой собственный TextView и установить на нем шрифт, как это предлагает #jposedlujan. Но недостаток в этом подходе состоит в том, что каждый раз, когда будет создаваться объект TextView, будет создаваться новый объект Typeface, что крайне плохо для использования ОЗУ (объект Typeface обычно варьируется от 8-13 КБ для гарнитур, таких как Roboto). Поэтому лучше кэшировать ваш шрифт, как только он загрузится.

Шаг 1. Создайте кэш шрифтов для своего приложения.

public enum Font {

  // path to your font asset
  Y("fonts/Roboto-Regular.ttf");

  public final String name;
  private Typeface typeface;

  Font(String s) {
    name = s;
  }

  public Typeface getTypeface(Context context) {

    if (typeface != null) return typeface;
    try {
      return typeface = Typeface.createFromAsset(context.getAssets(), name);
    } catch (Exception e) {
      return null;
    }
  }

  public static Font fromName(String fontName) {

    return Font.valueOf(fontName.toUpperCase());
  }

Шаг 2. Определите свой собственный атрибут "customFont" в файле attrs.xml для вашего CustomTextView

attrs.xml - 
<declare-styleable name="CustomFontTextView">
    <attr name="customFont"/>
</declare-styleable>


<com.packagename.CustomFontTextView
            android:id="@+id/some_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:customFont="rl"/>

Шаг 3: Создайте свой собственный TextView

public class CustomFontTextView extends TextView {

public CustomFontTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context, attrs);
}

public CustomFontTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

public CustomFontTextView(Context context) {
    super(context);
    init(context, null);
}

private void init(Context context, AttributeSet attrs) {

  if (attrs == null) {
    return;
  }

  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomFontTextView, 0 ,0);
  String fontName = a.getString(R.styleable.CustomFontTextView_customFont);

  String textStyle = attrs.getAttributeValue(styleScheme, styleAttribute);

  if (fontName != null) {
    Typeface typeface = Font.fromName(fontName).getTypeface(context);
    if (textStyle != null) {
      int style = Integer.decode(textStyle);
      setTypeface(typeface, style);
    } else {
      setTypeface(typeface);
    }
  }
  a.recycle();
} 

Создайте свой собственный TextView с пользовательским стилем.

Пример:

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/yourfont.ttf");
        setTypeface(tf);
    }
}

Вы можете использовать в своем XML.

Другие вопросы по тегам