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


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

Я знаю, что могу загрузить встроенный fontface вот так (style.xml):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
    <item name="android:typeface">monospace</item>
  </style>
</resources>

И использовать его (Main.axml):

<TextView
        style="@style/CodeFont"
        local:MvxBind="Text Hello" />

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

Итак, что-то вроде:

 <resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
      <item name="android:typeface">MyCustomFontLoadedFromAsset</item>
    </style>
 </resources>
Возможно ли это (и как это сделать)?
4 7

4 ответа:

Нет способа сделать это прямо из коробки. Есть библиотека под названием каллиграфия, которая позволит вам это сделать. Он будет работать на API 7+

Я также видел трюк, использующий отражение, чтобы переопределить serif/sans, чтобы вы могли определить их в своем styles.xml: Можно ли установить пользовательский шрифт для всего приложения?, хотя я бы рекомендовал первый подход.

public class MyApplication extends Application {

    private Typeface normalFont;
    private Typeface boldFont;

    ...

    /**
     * Fonts
     */
    public void setTypeface(TextView textView) {
        if(textView != null) {
            if(textView.getTypeface() != null && textView.getTypeface().isBold()) {
                textView.setTypeface(getBoldFont());
            } else {
                textView.setTypeface(getNormalFont());
            }
        }
    }

    private Typeface getNormalFont() {
        if(normalFont == null) {
            normalFont = Typeface.createFromAsset(getAssets(),"fonts/my_font.ttf");
        }
        return this.normalFont;
    }

    private Typeface getBoldFont() {
        if(boldFont == null) {
            boldFont = Typeface.createFromAsset(getAssets(),"fonts/my_font_bold.ttf");
        }
        return this.boldFont;
    }
}
String fontPath = "PT_Sans-Narrow-Web-Regular.ttf";

holder.desc = (TextView) row.findViewById(R.id.msgdesc);
// Loading Font Face
Typeface tf = Typeface.createFromAsset(
        row.getContext().getAssets(), fontPath);

// Applying font
holder.desc.setTypeface(tf);
info1 = (TextView) findViewById(R.id.textView1);
Typeface font = Typeface.createFromAsset(this.getAssets(),
            "fonts/KeepCalm-Medium.ttf");
info1.setTypeface(font);
info1.setTextColor(Color.parseColor("#FFFFFF"));