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


71

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

谢谢。

Answers:


147

您需要在项目中的Assets文件夹下创建fonts文件夹,然后将TTF放入其中。然后在您的活动中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 /
目录

4
它不在src下,assets文件夹应在您的主项目文件夹下(与src,res,gen,bin ...处于同一级别)。检查:developer.android.com/tools/projects/index.html
Zelimir

3
@Zelimir是否没有办法对该项目进行普遍推广?而不是采用每个TextView并设置其字体?
Libathos 2014年

@libathos-听起来很合理,但是我不确定该怎么做。没有时间进行调查,对吗?
Zelimir 2014年

@libathos不错,您可以通过xml定义一个Typeface,但是实际上比编写代码需要更多的书写
Libathos 2014年

12

您可以使用带有自定义字体的整个应用程序使用自定义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

在Assets文件夹中创建一个名为fonts的文件夹,并从下面的链接添加代码段。

Typeface tf = Typeface.createFromAsset(getApplicationContext().getAssets(),"fonts/fontname.ttf");
textview.setTypeface(tf);

7

要实现您需要使用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()所以您可以将foreach替换为简单的for循环。
艾哈迈德·哈森。

5

完成此操作的最简单方法是将所需字体与您的应用程序打包在一起。为此,只需在项目根目录中创建一个asset /文件夹,然后将字体(采用TrueType或TTF格式)放入这些资产中。例如,您可以创建资产/字体/并将TTF文件放在其中。

然后,您需要告诉小部件使用该字体。不幸的是,您不能再为此使用布局XML,因为XML不知道您可能已将其藏为应用程序资产。相反,您需要通过调用Typeface.createFromAsset(getAssets(),“ fonts / HandmadeTypewriter.ttf”)进行Java代码更改,然后获取创建的Typeface对象并将其通过setTypeface()传递给TextView。

要获得更多参考,请参见我获得的教程:

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


2

我推荐这个 将自定义字体的名称添加typefacestyles.xml其中并将您的字体集放入assets文件夹中,方法非常好。


1
很好的方法,建议您注意一下。如果将来无法访问链接,则复制主代码并发布在此处可能是一个好主意。

2

除了上述答案外,还有一点。当在片段内使用字体时,字体实例化应在onAttach方法(override)中完成,如下所示:

@Override
public void onAttach(Activity activity){
    super.onAttach(activity);
    Typeface tf = Typeface.createFromAsset(getApplicationContext().getAssets(),"fonts/fontname.ttf");
}

原因
在短时间内将片段附加到活动上。如果在将片段附加到活动之前调用CreateFromAsset方法,则会发生错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.