Пользовательские шрифты и пользовательский просмотр текста на Android - PullRequest
18 голосов
/ 21 января 2012

Из приложения, которое мне нужно разработать, я получил определенный шрифт, который имеет много файлов, таких как FontName-Regular, FontName-Bold , FontName-it . Мне нужно использовать его во всех текстовых представлениях в приложении. Сначала я подумал, что это простая задача. Посмотрите на SO и нашел очень хороший поток: здесь

Итак, сначала мне понравилось:

public static void overrideFonts(final Context context, final View v) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideFonts(context, child);
            }
        } else if (v instanceof TextView) {
            ((TextView)v).setTypeface(FONT_REGULAR);
        }
    } catch (Exception e) {
        e.printStackTrace();
        // ignore
    }
}

И вызвал этот метод во время onCreate в моей деятельности. Каждый textView в моем приложении показывал этот шрифт и мальчика, я был рад, что так легко ушел. Пока я не попал на экран, где для некоторых видов текста требуется Жирный как Style (android:textStyle="bold"). Тогда я понял, что это решение не дает мне возможности загрузить Font-Bold .ttf из активов.

Чем заглянул дальше и увидел красивую пользовательскую реализацию TextView, в том же вопросе SO:

public class MyTextView extends TextView {

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

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

    public MyTextView(Context context) {
        super(context);
        init();
    }

    public void init() {

        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf");
        setTypeface(tf ,1);

    }
    }

Это выглядит даже лучше. Мой вопрос: как я могу определить на init(), если для моего элемента управления установлено значение Bold или нет, чтобы я мог назначить запрошенную TypeFace?

Спасибо за ваше время.

LE. Следуя приведенному ниже примеру, я обновил свой класс как

public class MyTextView extends TextView {

    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR);
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(),  Constants.FONT_BOLD);

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

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

    public MyTextView(Context context) {
        super(context);
    }

    public void setTypeface(Typeface tf, int style) {
        if (style == Typeface.BOLD) {
            super.setTypeface(boldTypeface/*, -1*/);
        } else {
            super.setTypeface(normalTypeface/*, -1*/);
        }
    }
}

Что ж, если я отлаживаю, приложение переходит в setTypeFace и, кажется, применяет жирный, но на моем макете я не вижу никаких изменений, не жирный. Независимо от того, какой шрифт я использую, в TextView не вносятся никакие изменения, и он отображается шрифтом Android по умолчанию. Интересно почему?

Я подвел итог всему посту в блоге здесь, в моем блоге возможно, это кому-нибудь поможет.

Ответы [ 3 ]

26 голосов
/ 21 января 2012

Конструктор TextView вызывает setTypeface(Typeface tf, int style) с параметром style, полученным из атрибута XML android:textStyle. Таким образом, если вы хотите перехватить этот вызов для принудительного использования своей собственной гарнитуры, вы можете переопределить этот метод следующим образом:

public void setTypeface(Typeface tf, int style) {
    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf");
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf");

    if (style == Typeface.BOLD) {
        super.setTypeface(boldTypeface/*, -1*/);
    } else {
        super.setTypeface(normalTypeface/*, -1*/);
    }
}
9 голосов
/ 04 августа 2013

Вы можете использовать my CustomTextView, который позволяет указать имя файла шрифта в папке assets:

https://github.com/mafshin/CustomTextView

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

<com.my.app.CustomTextView
        xmlns:custom="http://schemas.android.com/apk/res/com.my.app"            
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test text"
        android:id="@+id/testcustomview" 

        custom:fontAssetName="Politica XT.otf"
        />
2 голосов
/ 11 марта 2016

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

  package com.codeslips.utilities;  

  import android.content.Context; 
  import android.graphics.Typeface;
  import android.util.AttributeSet;
  import android.widget.TextView;  

  public class CustomTextView extends TextView {  

          public CustomTextView(Context context)
               { super(context); setFont(); }  

          public CustomTextView(Context context,AttributeSet set)
             { super(context,set); setFont(); } 

          public CustomTextView(Context context,AttributeSet set,int defaultStyle) 
             { super(context,set,defaultStyle); setFont(); } 

          private void setFont() { 

           Typeface typeface=Typeface.createFromAsset(getContext().getAssets(),"fonts/your-font.ttf"); 
           setTypeface(typeface); //function used to set font

             }  
          }

Теперь используйте вышеуказанный класс в своем XML-файле, чтобываш собственный шрифт

    <com.codeslips.utilities.CustomTextView   
       android:layout_width="wrap_content" 
       android:layout_height="match_parent"
       android:text="Upload Image" 
       android:paddingTop="10sp"
       android:textSize="14sp"
       android:layout_weight="0.7"
       android:textColor="@android:color/white"/>
...