在TextView中设置Roboto字体 - xml

时间:2013-03-31 19:06:38

标签: android textview

我发现了几篇关于此主题的帖子,但所有这些主题都是在setTypeFace()对象上使用TextView方法设置字体,或创建将字体设置为{{的自定义类1}}和Roboto extends。据我所知,从API级别11(?)或其他东西,我们可以将TypeFace设置为xml属性,一些如何。像这样:

TextView

这样做的正确方法是什么?如果应用程序在低于API级别11(?)的设备上运行,是否可以进行回退:

   <TextView
      android:id="@+id/profileHeader"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:typeface="roboto"
      android:text="Hello, world">
   </TextView>

6 个答案:

答案 0 :(得分:6)

看看RobotoTextView项目。适用于Android 1.5,您可以使用XML属性设置字体。它还包括其他视图,如RobotoButton,RobotoCheckbox等。

答案 1 :(得分:1)

我没有看到你可以将外部字体定义为xml属性的方法。您应该将字体存储在资产中并调用:

tv.setTypeface( Typeface.createFromAsset( context.getAssets(), roboto.ttf ) );

答案 2 :(得分:1)

您不能直接从资产中设置字体,您必须按照以下步骤在onCreate中设置。这将是你想做的事情。

TextView tvTextView = (TextView) findViewById(R.id.textView1);
Typeface typeface = Typeface.createFromAsset(getAssets(),"Roboto.ttf");
tvTextView.setTypeface(typeface);

希望它会帮助你。:D

答案 3 :(得分:1)

android:typeface属性只有几个有效选项(根据Android文档)...

  • 正常
  • SANS
  • 等宽

如果您的应用中需要Roboto字体用于旧设备,则需要将Roboto TTF文件包含在项目中。

使用这些字体最明显的方法是使用TextView的setTypeface()方法,但是如果要在XML中指定它,则必须创建自定义TextView并为自定义创建自己的可设置样式属性TextView中。

This topic is all over the Internet

答案 4 :(得分:1)

对于JellyBean(4.1),您可以使用this StackOverflow topic中提供的方法。它会优雅地回避旧设备中的sans。 如果您必须回退到monospace或serif,请声明文件夹layout-v16,其中您使用所选的字体,即“sans-serif-condensed”,并在默认文件夹中使用“monospace”或“serif”字体。 如果你想要回退到非默认字体,你可以编程检查android版本并选择适当的动作,即:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
    TextView textView = (TextView) findViewById(R.id.textView_id);
    Typeface myFont = Typeface.createFromAsset(getAssets(),"RobotoCondensed.ttf");
    textView.setTypeface(myFont);
}

答案 5 :(得分:1)

这是为了让未来的人遇到与我相同的问题。在加载多行时,设置字体往往会占用大量内存。使用以下两个代码实际上使其顺利运行。我从stackoverflow获得了解决方案,但他们的答案没有列在一起。

public class RobotoTextView extends TextView {

Context context;

public RobotoTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
}

public RobotoTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
}

public RobotoTextView(Context context) {
    super(context);
    this.context = context;
}

public void setTypeface(Typeface tf, int style) {
    if (!isInEditMode()) {
        if (style == Typeface.NORMAL) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-Light.ttf"));
        } else if (style == Typeface.ITALIC) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-LightItalic.ttf"));
        } else if (style == Typeface.BOLD) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-Bold.ttf"));
        } else if (style == Typeface.BOLD_ITALIC) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-BoldItalic.ttf"));
        }

    }
}



public class TypeFaceProvider {

private static Hashtable<String, Typeface> sTypeFaces = new Hashtable<String, Typeface>(
        4);

public static Typeface getTypeFace(Context context, String fileName) {
    Typeface tempTypeface = sTypeFaces.get(fileName);

    if (tempTypeface == null) {
        tempTypeface = Typeface.createFromAsset(context.getAssets(),
                fileName);
        sTypeFaces.put(fileName, tempTypeface);
    }

    return tempTypeface;
}
}