我发现了几篇关于此主题的帖子,但所有这些主题都是在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>
答案 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文档)...
如果您的应用中需要Roboto字体用于旧设备,则需要将Roboto TTF文件包含在项目中。
使用这些字体最明显的方法是使用TextView的setTypeface()
方法,但是如果要在XML中指定它,则必须创建自定义TextView并为自定义创建自己的可设置样式属性TextView中。
答案 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;
}
}