Android上的自定义字体和自定义Textview

时间:2012-01-21 16:11:23

标签: android custom-controls textview typeface

从我需要开发的应用程序中,我收到了一个特定字体,其中包含许多文件,如FontName-Regular, FontName-Bold FontName-it 。我需要在应用程序的所有textview中使用它。首先,我认为这是一项简单的任务。查看SO并找到一个非常好的主题:here

首先,我确实喜欢:

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都显示出字体和男孩,我很高兴能够轻松逃离。直到我进入一个屏幕,其中某些文字视图需要粗体Styleandroid:textStyle="bold")。然后我意识到这个解决方案不能让我从资产中加载 Font-Bold .ttf。

在相同的SO问题中,进一步观察并看到一个不错的自定义TextView实现:

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()上检测到我的控件是否将样式设置为粗体,以便我可以分配所请求的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字体显示。我想知道为什么?

我在博客文章here on my blog上总结了所有内容。也许这会对某人有所帮助。

3 个答案:

答案 0 :(得分:26)

TextView的构造函数调用setTypeface(Typeface tf, int style),并从XML属性style中检索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*/);
    }
}

答案 1 :(得分:9)

您可以使用我的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 :(得分:2)

我认为最好为自定义字体创建自己的包并将其导入项目中,以便日后可以使用它们

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