所以我想在android中更改android:fontFamily,但我在android中没有看到任何预定义的字体。如何选择预定义的选项之一?我真的不需要定义我自己的TypeFace,但我所需要的是与现在显示的不同。
<TextView
android:id="@+id/HeaderText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="52dp"
android:gravity="center"
android:text="CallerBlocker"
android:textSize="40dp"
android:fontFamily="Arial"
/>
看来我在上面做的事真的行不通!BTW android:fontFamily=“Arial”是一个愚蠢的尝试!
Android不允许您从XML布局设置自定义字体。相反,您必须将特定字体文件绑定到应用程序的assets文件夹中,并以编程方式进行设置。类似于:
TextView textView = (TextView) findViewById(<your TextView ID>);
Typeface typeFace = Typeface.createFromAsset(getAssets(), "<file name>");
textView.setTypeface(typeFace);
注意,只有在调用setContentView()后才能运行此代码。此外,Android只支持某些字体,并且应为.ttf(TrueType)或.otf(OpenType)格式。即使如此,某些字体也可能不起作用。
这是一种在Android上绝对有效的字体,如果Android不支持您的字体文件,您可以使用它来确认您的代码是否有效。
Android O更新:根据Roger的评论,这现在可以在Android O中使用XML。
一种简单的方法是在项目中添加所需的字体。
转到文件->新建->新建资源目录选择字体
这将在资源中创建一个新目录,字体。
下载字体(.ttf)。我使用https://fonts.google.com同样的
将其添加到字体文件夹中,然后在XML中或以编程方式使用它们。
XML格式-
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/your_font"/>
程序性地-
Typeface typeface = ResourcesCompat.getFont(this, R.font.your_font);
textView.setTypeface(typeface);
以编程方式将字体添加到TextView的最简单方法是,首先,将字体文件添加到项目中的“资产”文件夹中。例如,字体路径如下所示:assets/fonts/my_font.otf
并将其添加到TextView中:
科特林
val font_path = "fonts/my_font.otf"
myTypeface = Typeface.createFromAsset(MyApplication.getInstance().assets, font_path)
textView.typeface = myTypeface
Java
String font_path = "fonts/my_font.otf";
Typeface myTypeface = Typeface.createFromAsset(MyApplication.getInstance().assets, font_path)
textView.setTypeface(myTypeface);
android:fontFamily的有效值在/system/etc/system_fonts.xml(4.x)或/system/etc/fonts.xml(5.x)中定义。但设备制造商可能会对其进行修改,因此设置fontFamily值所使用的实际字体取决于指定设备的上述文件。
在AOSP中,Arial字体是有效的,但必须使用“Arial”而不是“Arial”来定义,例如android:fontFamily=“Arial“。仔细看看Kitkat的system_fonts.xml
<family>
<nameset>
<name>sans-serif</name>
<name>arial</name>
<name>helvetica</name>
<name>tahoma</name>
<name>verdana</name>
</nameset>
<fileset>
<file>Roboto-Regular.ttf</file>
<file>Roboto-Bold.ttf</file>
<file>Roboto-Italic.ttf</file>
<file>Roboto-BoldItalic.ttf</file>
</fileset>
</family>
//////////////////////////////////////////////////////////////////////////
在布局中定义“字体”有三个相关的xml属性——android:fontFamily、android:type和android:textStyle。“fontFamily”和“textStyle”或“字体”和“文本样式”的组合可用于更改文本中字体的外观,单独使用也是如此。TextView.java中的代码段如下:
private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) {
Typeface tf = null;
if (familyName != null) {
tf = Typeface.create(familyName, styleIndex);
if (tf != null) {
setTypeface(tf);
return;
}
}
switch (typefaceIndex) {
case SANS:
tf = Typeface.SANS_SERIF;
break;
case SERIF:
tf = Typeface.SERIF;
break;
case MONOSPACE:
tf = Typeface.MONOSPACE;
break;
}
setTypeface(tf, styleIndex);
}
public void setTypeface(Typeface tf, int style) {
if (style > 0) {
if (tf == null) {
tf = Typeface.defaultFromStyle(style);
} else {
tf = Typeface.create(tf, style);
}
setTypeface(tf);
// now compute what (if any) algorithmic styling is needed
int typefaceStyle = tf != null ? tf.getStyle() : 0;
int need = style & ~typefaceStyle;
mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);
} else {
mTextPaint.setFakeBoldText(false);
mTextPaint.setTextSkewX(0);
setTypeface(tf);
}
}
从代码中我们可以看到:
如果设置了“fontFamily”,则将忽略“字体”。“字体”具有标准和有限的有效值。事实上,这些值是“normal”、“sans”、“serif”和“monospace”,它们可以在system_fonts.xml(4.x)或fonts.xml(5.x)中找到。实际上,“normal“和”sans“都是系统的默认字体。“fontFamily”可用于设置内置字体的所有字体,而“字体”仅提供“sans-serif”、“serif”和“monospace”(世界上三大字体类型)的典型字体。当只设置“textStyle”时,我们实际上设置了默认字体和指定的样式。有效值为“normal”、“bold”、“italic”和“bold | italic”。