如何将外部字体添加到安卓应用程序

71

我正在寻找一些时尚的字体用于我的安卓应用程序。但问题是如何使我的安卓应用程序支持外部字体。

谢谢。

7个回答

147

你需要在项目的assets文件夹下创建一个fonts文件夹,并将你的TTF字体文件放到其中。然后在你的Activity的onCreate()方法中:

TextView myTextView=(TextView)findViewById(R.id.textBox);
Typeface typeFace=Typeface.createFromAsset(getAssets(),"fonts/mytruetypefont.ttf");
myTextView.setTypeface(typeFace);
请注意,并非所有的 TTF 文件都能正常工作。在我的实验中,只有一部分字体可以正常工作(在 Windows 系统上,只有名称采用小写字母书写的字体可以正常工作)。

6
这个资产文件夹在哪里?我正在使用Android Studio,但在src/下找不到它。 - intoTHEwild
4
不在src文件夹下,assets文件夹应该位于项目主文件夹中(与src、res、gen、bin文件夹在同一级别)。请检查:http://developer.android.com/tools/projects/index.html - Zelimir
3
有没有一种普遍的方式来为整个项目设置字体?而不是每个TextView都设置它的字体? - Libathos
@libathos - 听起来合理,但我不确定如何做到这一点。我没有时间去调查,你呢? - Zelimir
@libathos 嗯,你可以通过 XML 定义 Typeface,但实际上这需要比在代码中拥有它更多的编写。 - Libathos
显示剩余3条评论

12
您可以使用自定义的TextView来为整个应用程序设置自定义字体,以下是一个示例:

您可以在此处使用自定义字体为整个应用程序设置自定义TextView,以下是一个示例:

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*/);
       }
   }
}

9
在资产文件夹中创建一个名为“fonts”的文件夹,并添加下面链接中的片段。
Typeface tf = Typeface.createFromAsset(getApplicationContext().getAssets(),"fonts/fontname.ttf");
textview.setTypeface(tf);

7
为了实现这个功能,你需要使用Typeface。请参考以下示例:

要实现此功能,请使用Typeface,如下所示:

Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/Roboto/Roboto-Regular.ttf");
for (View view : allViews)
{
   if (view instanceof TextView) 
   {
      TextView textView = (TextView) view;
      textView.setTypeface(typeface);
      }
   }
}

1
对于 allViews,您必须使用 getChildCount() 循环遍历布局,这样您就可以用简单的 for 循环替换 foreach。 - Ahmed Hasn.

5
最简单的方法是将所需字体与应用程序一起打包。要做到这一点,只需在项目根目录中创建一个assets/文件夹,并将您的字体(以TrueType或TTF形式)放入其中。例如,您可以创建assets/fonts/并将TTF文件放在其中。
然后,您需要告诉小部件使用该字体。不幸的是,您不能再使用布局XML来实现此目的,因为XML不知道您可能已经藏在应用程序资产中的任何字体。相反,您需要通过调用Typeface.createFromAsset(getAssets(), “fonts/HandmadeTypewriter.ttf”)在Java代码中进行更改,然后将创建的Typeface对象传递给您的TextView通过setTypeface()方法。
有关更多参考,请参阅我获取此内容的教程:

http://www.androidguys.com/2008/08/18/fun-with-fonts/


2

除了上述答案外,在片段中使用字体时,应该在 onAttach 方法中(重写)进行字体实例化,如下所示:

@Override
public void onAttach(Activity activity){
    super.onAttach(activity);
    Typeface tf = Typeface.createFromAsset(getApplicationContext().getAssets(),"fonts/fontname.ttf");
}
原因
在片段附加到活动之前,有很短的时间间隔。如果在将片段附加到活动之前调用CreateFromAsset方法,则会出现错误。

2
我推荐这种方法,它非常好,可以在styles.xml中添加自定义字体的名称到typeface,并将你的字体集放入assets文件夹中。approach

1
非常好的方法,我建议引起注意。如果链接将来无法访问,复制主要代码并在此处发布可能是个好主意。 - validcat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接