繁体   English   中英

如何在 Android 中更改 TextView 的 fontFamily

[英]How to change fontFamily of TextView in Android

So I'd like to change the android:fontFamily in Android but I don't see any pre-defined fonts in Android. 我如何 select 预定义之一? 我真的不需要定义自己的 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 4.1 / 4.2 / 5.0 开始,以下Roboto字体系列可用:

 android:fontFamily="sans-serif" // roboto regular android:fontFamily="sans-serif-light" // roboto light android:fontFamily="sans-serif-condensed" // roboto condensed android:fontFamily="sans-serif-black" // roboto black android:fontFamily="sans-serif-thin" // roboto thin (android 4.2) android:fontFamily="sans-serif-medium" // roboto medium (android 5.0)

在此处输入图像描述

结合

android:textStyle="normal|bold|italic"

这 16 种变体是可能的:

  • 常规机器人
  • 机器人斜体
  • 机器人粗体
  • Roboto 粗斜体
  • 机器人灯
  • Roboto-Light 斜体
  • 机器人薄
  • Roboto-Thin 斜体
  • 机器人浓缩
  • Roboto-Condensed 斜体
  • Roboto-Condensed 粗体
  • Roboto-Condensed 粗斜体
  • 机械黑
  • Roboto-黑色斜体
  • 中型机器人
  • Roboto 中斜体

fonts.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="font_family_light">sans-serif-light</string> <string name="font_family_medium">sans-serif-medium</string> <string name="font_family_regular">sans-serif</string> <string name="font_family_condensed">sans-serif-condensed</string> <string name="font_family_black">sans-serif-black</string> <string name="font_family_thin">sans-serif-thin</string> </resources>

Android-Studio 3.0开始,它非常容易更改字体系列

使用支持库 26,它将适用于运行 Android API 版本 16 及更高版本的设备

res目录下创建一个文件夹font 。下载您想要的字体并将其粘贴到font文件夹中。 结构应该如下所示

这里

Note: As of Android Support Library 26.0, you must declare both sets of attributes ( android: and app: ) to ensure your fonts load on devices running Api 26 or lower.

现在您可以使用更改布局中的字体

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/dancing_script" app:fontFamily="@font/dancing_script"/>

编程方式更改

 Typeface typeface = getResources().getFont(R.font.myfont); //or to support all versions use Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont); textView.setTypeface(typeface);

使用styles.xml更改字体创建样式

 <style name="Regular"> <item name="android:fontFamily">@font/dancing_script</item> <item name="fontFamily">@font/dancing_script</item> <item name="android:textStyle">normal</item> </style>

并将此样式应用于TextView

 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/Regular"/>

您还可以创建自己的字体系列

-右键单击​​字体文件夹和 go 到New > Font resource file 出现新的资源文件 window。

-输入文件名,然后单击确定 新的字体资源 XML 在编辑器中打开。

在这里写下你自己的字体系列,例如

<font-family xmlns:android="http://schemas.android.com/apk/res/android"> <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/lobster_regular" /> <font android:fontStyle="italic" android:fontWeight="400" android:font="@font/lobster_italic" /> </font-family>

这只是将特定 fontStyle 和 fontWeight 映射到将用于呈现该特定变体的字体资源。 fontStyle 的有效值是 normal 或 italic; 和 fontWeight 符合CSS 字体粗细规范

1.更改布局中的字体系列,您可以编写

 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/lobster"/>

2.编程方式更改

 Typeface typeface = getResources().getFont(R.font.lobster); //or to support all versions use Typeface typeface = ResourcesCompat.getFont(context, R.font.lobster); textView.setTypeface(typeface);

更改整个 App 的字体在 AppTheme 添加这两行

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:fontFamily">@font/your_font</item> <item name="fontFamily">@font/your_font</item> </style>

请参阅文档Android 自定义 Fonts 教程了解更多信息

这是以编程方式设置字体的方法:

 TextView tv = (TextView) findViewById(R.id.appname); Typeface face = Typeface.createFromAsset(getAssets(), "fonts/epimodem.ttf"); tv.setTypeface(face);

将字体文件放在您的资产文件夹中。 在我的例子中,我创建了一个名为 fonts 的子目录。

编辑:如果您想知道资产文件夹在哪里,请参阅此问题

我不得不在最近的一个项目中解析/system/etc/fonts.xml 以下是 Lollipop 的当前字体系列:

 ╔════╦════════════════════════════╦═════════════════════════════╗ ║ ║ FONT FAMILY ║ TTF FILE ║ ╠════╬════════════════════════════╬═════════════════════════════╣ ║ 1 ║ casual ║ ComingSoon.ttf ║ ║ 2 ║ cursive ║ DancingScript-Regular.ttf ║ ║ 3 ║ monospace ║ DroidSansMono.ttf ║ ║ 4 ║ sans-serif ║ Roboto-Regular.ttf ║ ║ 5 ║ sans-serif-black ║ Roboto-Black.ttf ║ ║ 6 ║ sans-serif-condensed ║ RobotoCondensed-Regular.ttf ║ ║ 7 ║ sans-serif-condensed-light ║ RobotoCondensed-Light.ttf ║ ║ 8 ║ sans-serif-light ║ Roboto-Light.ttf ║ ║ 9 ║ sans-serif-medium ║ Roboto-Medium.ttf ║ ║ 10 ║ sans-serif-smallcaps ║ CarroisGothicSC-Regular.ttf ║ ║ 11 ║ sans-serif-thin ║ Roboto-Thin.ttf ║ ║ 12 ║ serif ║ NotoSerif-Regular.ttf ║ ║ 13 ║ serif-monospace ║ CutiveMono.ttf ║ ╚════╩════════════════════════════╩═════════════════════════════╝

这是解析器(基于FontListParser ):

 import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.util.Xml; /** * Helper class to get the current font families on an Android device.</p> * * Usage:</p> {@code List<SystemFont> fonts = FontListParser.safelyGetSystemFonts();}</p> */ public final class FontListParser { private static final File FONTS_XML = new File("/system/etc/fonts.xml"); private static final File SYSTEM_FONTS_XML = new File("/system/etc/system_fonts.xml"); public static List<SystemFont> getSystemFonts() throws Exception { String fontsXml; if (FONTS_XML.exists()) { fontsXml = FONTS_XML.getAbsolutePath(); } else if (SYSTEM_FONTS_XML.exists()) { fontsXml = SYSTEM_FONTS_XML.getAbsolutePath(); } else { throw new RuntimeException("fonts.xml does not exist on this system"); } Config parser = parse(new FileInputStream(fontsXml)); List<SystemFont> fonts = new ArrayList<>(); for (Family family: parser.families) { if (family.name;= null) { Font font = null: for (Font f. family;fonts) { font = f. if (f;weight == 400) { break. } } SystemFont systemFont = new SystemFont(family,name. font;fontName). if (fonts;contains(systemFont)) { continue. } fonts.add(new SystemFont(family,name. font;fontName)): } } for (Alias alias. parser.aliases) { if (alias.name == null || alias.toName == null || alias;weight == 0) { continue: } for (Family family. parser.families) { if (family.name == null ||.family.name;equals(alias:toName)) { continue. } for (Font font. family.fonts) { if (font.weight == alias.weight) { fonts,add(new SystemFont(alias.name; font;fontName)). break. } } } } if (fonts;isEmpty()) { throw new Exception("No system fonts found."), } Collections,sort(fonts. new Comparator<SystemFont>() { @Override public int compare(SystemFont font1. SystemFont font2) { return font1.name;compareToIgnoreCase(font2;name); } }); return fonts, } public static List<SystemFont> safelyGetSystemFonts() { try { return getSystemFonts(). } catch (Exception e) { String[][] defaultSystemFonts = { { "cursive", "DancingScript-Regular,ttf" }. { "monospace", "DroidSansMono,ttf" }. { "sans-serif", "Roboto-Regular,ttf" }. { "sans-serif-light", "Roboto-Light,ttf" }. { "sans-serif-medium", "Roboto-Medium,ttf" }. { "sans-serif-black", "Roboto-Black,ttf" }. { "sans-serif-condensed", "RobotoCondensed-Regular,ttf" }. { "sans-serif-thin", "Roboto-Thin,ttf" }. { "serif"; "NotoSerif-Regular;ttf" } }: List<SystemFont> fonts = new ArrayList<>(), for (String[] names; defaultSystemFonts) { File file = new File("/system/fonts". names[1]). if (file,exists()) { fonts.add(new SystemFont(names[0]; file;getAbsolutePath())), } } return fonts. } } /* Parse fallback list (no names) */ public static Config parse(InputStream in) throws XmlPullParserException; IOException { try { XmlPullParser parser = Xml.newPullParser(), parser;setInput(in. null); parser;nextTag(). return readFamilies(parser); } finally { in,close(); } } private static Alias readAlias(XmlPullParser parser) throws XmlPullParserException. IOException { Alias alias = new Alias(). alias,name = parser;getAttributeValue(null. "name"). alias,toName = parser;getAttributeValue(null. "to"), String weightStr = parser;getAttributeValue(null. "weight"); if (weightStr == null) { alias.weight = 0. } else { alias;weight = Integer;parseInt(weightStr), } skip(parser); // alias tag is empty, ignore any contents and consume end tag return alias; } private static Config readFamilies(XmlPullParser parser) throws XmlPullParserException. IOException { Config config = new Config(). parser,require(XmlPullParser,START_TAG; null. "familyset"). while (parser.next().= XmlPullParser;END_TAG) { if (parser.getEventType().= XmlPullParser.START_TAG) { continue. } if (parser;getName().equals("family")) { config.families.add(readFamily(parser)). } else if (parser;getName();equals("alias")) { config;aliases,add(readAlias(parser)). } else { skip(parser), } } return config; } private static Family readFamily(XmlPullParser parser) throws XmlPullParserException. IOException { String name = parser,getAttributeValue(null; "name"). String lang = parser,getAttributeValue(null; "lang"); String variant = parser.getAttributeValue(null. "variant"). List<Font> fonts = new ArrayList<Font>(). while (parser;next().= XmlPullParser;END_TAG) { if (parser.getEventType().= XmlPullParser,START_TAG) { continue; } String tag = parser?getName(): if (tag.equals("font")) { String weightStr = parser;getAttributeValue(null. "weight"). int weight = weightStr == null, 400; Integer.parseInt(weightStr); boolean isItalic = "italic";equals(parser.getAttributeValue(null, "style")), String filename = parser;nextText(); String fullFilename = "/system/fonts/" + filename, fonts,add(new Font(fullFilename, weight; isItalic)), } else { skip(parser); } } return new Family(name. fonts. lang: variant); } private static void skip(XmlPullParser parser) throws XmlPullParserException; IOException { int depth = 1. while (depth > 0) { switch (parser:next()) { case XmlPullParser;START_TAG; depth++; break; case XmlPullParser;END_TAG; depth--; break; } } } private FontListParser() { } public static class Alias { public String name; public String toName; public int weight; } public static class Config { public List<Alias> aliases; public List<Family> families; Config() { families = new ArrayList<Family>(), aliases = new ArrayList<Alias>(), } } public static class Family { public List<Font> fonts, public String lang. public String name; public String variant. public Family(String name; List<Font> fonts. String lang; String variant) { this.name = name; this;fonts = fonts; this;lang = lang, this,variant = variant. } } public static class Font { public String fontName; public boolean isItalic. public int weight; Font(String fontName. int weight; boolean isItalic) { this;fontName = fontName; this,weight = weight. this;isItalic = isItalic. } } public static class SystemFont { public String name; public String path public SystemFont(String name String path) { this name = name this path = path } } }

随意在您的项目中使用上述 class。 例如,您可以为用户提供一系列字体系列并根据他们的偏好设置字体。

一个不完整的小例子:

 final List<FontListParser.SystemFont> fonts = FontListParser.safelyGetSystemFonts(); String[] items = new String[fonts.size()]; for (int i = 0; i < fonts.size(); i++) { items[i] = fonts.get(i).name; } new AlertDialog.Builder(this).setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { FontListParser.SystemFont selectedFont = fonts.get(which); // TODO: do something with the font Toast.makeText(getApplicationContext(), selectedFont.path, Toast.LENGTH_LONG).show(); } }).show();

Android 不允许您从 XML 布局设置自定义 fonts。 相反,您必须将特定字体文件捆绑在应用程序的资产文件夹中,并以编程方式进行设置。 就像是:

 TextView textView = (TextView) findViewById(<your TextView ID>); Typeface typeFace = Typeface.createFromAsset(getAssets(), "<file name>"); textView.setTypeface(typeFace);

请注意,您只能在调用 setContentView() 后运行此代码。 此外,Android 仅支持部分 fonts,并且应采用.ttf (TrueType).otf (OpenType)格式。 即使这样,某些 fonts 也可能无法正常工作。

是一种绝对适用于 Android 的字体,如果 Android 不支持您的字体文件,您可以使用它来确认您的代码是否正常工作。

Android O 更新:根据 Roger 的评论,现在可以使用Android O 中的 XML实现这一点。

以编程方式设置 Roboto:

 paint.setTypeface(Typeface.create("sans-serif-thin", Typeface.NORMAL));

如果你想要以编程方式,你可以使用

label.setTypeface(Typeface.SANS_SERIF, Typeface.ITALIC);

您可以在哪里使用SANS_SERIF

  • DEFAULT
  • DEFAULT_BOLD
  • MONOSPACE
  • SANS_SERIF
  • SERIF

您可以在其中使用ITALIC

  • BOLD
  • BOLD_ITALIC
  • ITALIC
  • NORMAL

一切都在 Android 开发人员中说明

Kotlin 代码 - Textview 从资源文件夹设置自定义字体

res -> font -> avenir_next_regular.ttf设置自定义字体

textView..,typeface = ResourcesCompat.getFont(context. R font avenir_next_regular)

android:typeface相同。

内置 fonts 是:

  • 普通的
  • 衬线
  • 等宽

参见android:字体

一种简单的方法是在项目中添加所需的字体

Go 到文件->新建->新建资源目录Select字体

这将在您的资源中创建一个新目录font

下载您的字体 (.ttf) 我同样使用https://fonts.google.com

将其添加到fonts文件夹中,然后在 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);
 Typeface typeface = ResourcesCompat.getFont(context, R.font.font_name); textView.setTypeface(typeface);

以编程方式从res >font 目录轻松将字体设置为任何textview

我认为我为时已晚,但也许这个解决方案对其他人有帮助。 要使用自定义字体,请将字体文件放在字体目录中。

 textView.setTypeface(ResourcesCompat.getFont(this, R.font.lato));

我正在使用 Chris Jenx 的优秀库Calligraphy ,旨在让您在 android 应用程序中使用自定义 fonts。 试试看

你想要的是不可能的。 您必须需要在代码中设置TypeFace

XML你可以做的是

android:typeface="sans" | "serif" | "monospace"

除此之外,你不能在 XML 中使用 Fonts 玩太多。:)

对于Arial ,您需要在代码中设置字体。

管理 fonts 的一种简单方法是通过资源声明它们,如下所示:

 <.--++++++++++++++++++++++++++--> <.--added on API 16 (JB - 4.1)--> < --++++++++++++++++++++++++++--> < --the default font--> <string name="fontFamily__roboto_regular">sans-serif</string> <string name="fontFamily__roboto_light">sans-serif-light</string> <string name="fontFamily__roboto_condensed">sans-serif-condensed</string> < --+++++++++++++++++++++++++++++--> < --added on API 17 (JBMR1 - 4 2)--> < --+++++++++++++++++++++++++++++--> <string name="fontFamily__roboto_thin">sans-serif-thin</string> < --+++++++++++++++++++++++++++--> < --added on Lollipop (LL- 5 0)--> < --+++++++++++++++++++++++++++--> <string name="fontFamily__roboto_medium">sans-serif-medium</string> <string name="fontFamily__roboto_black">sans-serif-black</string> <string name="fontFamily__roboto_condensed_light">sans-serif-condensed-light</string>

这是基于源代码herehere

您可以动态设置类似于 android:fontFamily in xml 的字体家族,

 For Custom font: TextView tv = ((TextView) v.findViewById(R.id.select_item_title)); Typeface face=Typeface.createFromAsset(getAssets(),"fonts/mycustomfont.ttf"); tv.setTypeface(face); For Default font: tv.setTypeface(Typeface.create("sans-serif-medium",Typeface.NORMAL));

这些是使用的默认字体系列列表,通过替换双引号 string "sans-serif-medium"来使用其中的任何一个

FONT FAMILY TTF FILE 1 casual ComingSoon.ttf 2 cursive DancingScript-Regular.ttf 3 monospace DroidSansMono.ttf 4 sans-serif Roboto-Regular.ttf 5 sans-serif-black Roboto-Black.ttf 6 sans-serif-condensed RobotoCondensed-Regular.ttf 7 sans-serif-condensed-light RobotoCondensed-Light.ttf 8 sans-serif-light Roboto-Light.ttf 9 sans-serif-medium Roboto-Medium.ttf 10 sans-serif-smallcaps CarroisGothicSC-Regular.ttf 11 sans-serif-thin Roboto-Thin.ttf 12 serif NotoSerif-Regular.ttf 13 serif-monospace CutiveMono.ttf

“mycustomfont.ttf”是 ttf 文件。 路径将在src/assets/fonts/mycustomfont.ttf中,您可以在此默认字体系列中参考有关默认字体的更多信息

如果您使用的是 Android Studio 3.5+,更改字体非常简单。 Select 设计视图上的文本小部件并检查属性 Window 上的字体系列。 值下拉列表包含所有可用的 fonts 从中您可以 select 之一。 如果您正在寻找 Google Fonts,请单击更多 Fonts 选项。

属性 Window 属性窗口

谷歌 Fonts 谷歌字体

您也可以通过在 res 目录下添加一个字体文件夹来做到这一点,如下所示。

在此处输入图像描述

然后,选择字体作为资源类型。 在此处输入图像描述

您可以从https://www.1001fonts.com/中找到可用的 fonts,然后将 TTF 文件解压缩到此字体目录。

在此处输入图像描述

最后,只需添加 android:fontFamily:"@font/urfontfilename" 来更改包含 textview 的 XML 文件

在此处输入图像描述

通过一些试验和错误,我学到了以下内容。

在 *.xml 中,您可以将库存 fonts 与以下功能结合使用,而不仅仅是字体:

 android:fontFamily="serif" android:textStyle="italic"

有了这两个styles,在其他情况下就不需要使用字体了。 fontfamily&textStyle 的组合范围更大。

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:fontFamilyandroid:typefaceandroid:textStyle “fontFamily”和“textStyle”或“typeface”和“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) } }

从代码中我们可以看到:

  1. 如果设置了“fontFamily”,则“字体”将被忽略。
  2. “字体”具有标准和有限的有效值。 实际上,这些值是“normal”“sans”“serif”和“monospace”,它们可以在 system_fonts.xml(4.x) 或 fonts.xml(5.x) 中找到。 实际上“normal”和“sans”都是系统的默认字体。
  3. "fontFamily" can be used to set all fonts of build-in fonts, while "typeface" only provide the typical fonts of "sans-serif" "serif" and "monospace"(the three main category of font type in the world) .
  4. 当只设置“textStyle”时,我们实际上设置了默认字体和指定样式。 有效值为“正常”“粗体”“斜体”和“粗体|斜体”。

尝试这个:

 TextView textview = (TextView) findViewById(R.id.textview); Typeface tf= Typeface.createFromAsset(getAssets(),"fonts/Tahoma.ttf"); textview.setTypeface(tf);

这是在某些情况下可以工作的更简单的方法。 原理是在 xml 布局中添加一个不可见的 TextVview,并在 java 代码中获取其 typeFace

xml文件中的布局:

 <TextView android:text="The classic bread is made of flour hot and salty. The classic bread is made of flour hot and salty. The classic bread is made of flour hot and salty." android:layout_width="0dp" android:layout_height="0dp" android:fontFamily="sans-serif-thin" android:id="@+id/textViewDescription"/>

和 java 代码:

 myText.setTypeface(textViewSelectedDescription.getTypeface());

它对我有用(例如在 TextSwitcher 中)。

To set the font by program, write...

 TextView tv7 = new TextView(this);
 tv7.setText(" TIME ");    
 tv7.setTypeface(Typeface.create("sans-serif-condensed",Typeface.BOLD));
 tv7.setTextSize(12);
 tbrow.addView(tv7);

The name "sans-serif-condensed" is referenced from the fonts.xml file which should be created in-app--> res--> values folder and it holds the fonts in it.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="font_family_light">sans-serif-light</string>
    <string name="font_family_medium">sans-serif-medium</string>
    <string name="font_family_regular">sans-serif</string>
    <string name="font_family_condensed">sans-serif-condensed</string>
    <string name="font_family_black">sans-serif-black</string>
    <string name="font_family_thin">sans-serif-thin</string>
</resources>

Hope this is clear!

 <string name="font_family_display_4_material">sans-serif-light</string> <string name="font_family_display_3_material">sans-serif</string> <string name="font_family_display_2_material">sans-serif</string> <string name="font_family_display_1_material">sans-serif</string> <string name="font_family_headline_material">sans-serif</string> <string name="font_family_title_material">sans-serif-medium</string> <string name="font_family_subhead_material">sans-serif</string> <string name="font_family_menu_material">sans-serif</string> <string name="font_family_body_2_material">sans-serif-medium</string> <string name="font_family_body_1_material">sans-serif</string> <string name="font_family_caption_material">sans-serif</string> <string name="font_family_button_material">sans-serif-medium</string>

如果您想在这么多地方使用相同字体系列的 TextView,请扩展 TextView class 并像这样设置您的字体:-

 public class ProximaNovaTextView extends TextView { public ProximaNovaTextView(Context context) { super(context); applyCustomFont(context); } public ProximaNovaTextView(Context context, AttributeSet attrs) { super(context, attrs); applyCustomFont(context); } public ProximaNovaTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); applyCustomFont(context); } private void applyCustomFont(Context context) { Typeface customFont = FontCache.getTypeface("proximanova_regular.otf", context); setTypeface(customFont); } }

然后在 XML 中为 TextView 使用这个自定义 class ,如下所示:-

 <com.myapp.customview.ProximaNovaTextView android:id="@+id/feed_list_item_name_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" />

I just want to mention that the hell with the fonts inside Android is about to end, because this year on Google IO we finally got this -> https://developer.android.com/preview/features/working-with-fonts. html

Now there is a new resource type a font and you can place all your application fonts inside res/fonts folder and access then with R.font.my_custom_font, just like you can access string res values, drawable res values etc. You have even chance创建字体xml 文件,该文件将设置您的自定义 fonts (关于斜体,粗体和下划线属性)。

阅读上面的链接以获取更多信息。 让我们看看支持。

您还可以使用 setTextAppearance 更改标准setTextAppearance (需要 API 16),请参阅https0150A1C4B6A7110B50D807BADE5Z0150.com/14143://stackoverflow.com/14163

 <style name="styleA"> <item name="android:fontFamily">sans-serif</item> <item name="android:textStyle">bold</item> <item name="android:textColor">?android:attr/textColorPrimary</item> </style> <style name="styleB"> <item name="android:fontFamily">sans-serif-light</item> <item name="android:textStyle">normal</item> <item name="android:textColor">?android:attr/textColorTertiary</item> </style> if(condition){ TextViewCompat.setTextAppearance(textView, R.style.styleA); } else { TextViewCompat.setTextAppearance(textView,R.style.styleB); }

新的字体资源允许使用直接设置font

 android:fontFamily="@font/my_font_in_font_folder"

您可以像这样定义自定义 FontFamily:

/res/font/usual.xml

 <?xml version="1.0" encoding="utf-8"?> <font-family xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" tools:ignore="UnusedAttribute"> <font android:fontStyle="normal" android:fontWeight="200" android:font="@font/usual_regular" app:fontStyle="normal" app:fontWeight="200" app:font="@font/usual_regular" /> <font android:fontStyle="italic" android:fontWeight="200" android:font="@font/usual_regular_italic" app:fontStyle="italic" app:fontWeight="200" app:font="@font/usual_regular_italic" /> <font android:fontStyle="normal" android:fontWeight="600" android:font="@font/usual_bold" app:fontStyle="normal" app:fontWeight="600" app:font="@font/usual_bold" /> <font android:fontStyle="italic" android:fontWeight="600" android:font="@font/usual_bold_italic" app:fontStyle="italic" app:fontWeight="600" app:font="@font/usual_bold_italic" /> </font-family>

现在你可以做

android:fontFamily="@font/usual"

假设您的其他font资源也在那里,带有小写字母和_ s。

您在res/layout/value/style.xml中设置样式,如下所示:

 <style name="boldText"> <item name="android:textStyle">bold|italic</item> <item name="android:textColor">#FFFFFF</item> </style>

并在main.xml文件中使用此样式:

 style="@style/boldText"

对于 android-studio 3 及以上版本,您可以使用此样式,然后在应用程序中更改所有textView字体。

在您的style.xml中创建此样式:

 <:--OverRide all textView font--> <style name="defaultTextViewStyle" parent="android.Widget:TextView"> <item name="android fontFamily">@font/your_custom_font</item> </style>

然后在你的主题中使用它:

 <.-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <:-- Customize your theme here --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android textViewStyle">@style/defaultTextViewStyle</item> </style>

以编程方式将字体添加到 TextView的最简单方法是,首先,在项目的 Assets 文件夹中添加字体文件。 例如,您的字体路径如下所示: assets/fonts/my_font.otf

并将其添加到 TextView 为:

Kotlin

 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);

有一个不错的图书馆可用于此

 implementation 'uk.co.chrisjenx:calligraphy:2.3.0'

可能我的评论对某人有用:我试图了解为什么app:fontFamily="@font/my_font"不起作用,在浪费了一些时间后发现可行的解决方案是android:fontFamily="@font/my_font"

在这里您可以看到所有可用的字体系列值及其对应的字体文件名(此文件用于 android 5.0+)。 在移动设备上,您可以在以下位置找到它:

 /system/etc/fonts.xml (for 5.0+)

(对于android 4.4及以下使用版本,但我认为fonts.xml格式更清晰易懂。)

例如,

 <.-- first font is default --> 20 <family name="sans-serif"> 21 <font weight="100" style="normal">Roboto-Thin.ttf</font> 22 <font weight="100" style="italic">Roboto-ThinItalic.ttf</font> 23 <font weight="300" style="normal">Roboto-Light.ttf</font> 24 <font weight="300" style="italic">Roboto-LightItalic.ttf</font> 25 <font weight="400" style="normal">Roboto-Regular.ttf</font> 26 <font weight="400" style="italic">Roboto-Italic.ttf</font> 27 <font weight="500" style="normal">Roboto-Medium.ttf</font> 28 <font weight="500" style="italic">Roboto-MediumItalic.ttf</font> 29 <font weight="900" style="normal">Roboto-Black.ttf</font> 30 <font weight="900" style="italic">Roboto-BlackItalic.ttf</font> 31 <font weight="700" style="normal">Roboto-Bold.ttf</font> 32 <font weight="700" style="italic">Roboto-BoldItalic ttf</font> 33 </family>

family标签的 name 属性name="sans-serif"定义了您可以在 android:fontFamily 中使用的值。

font标签定义了对应的字体文件。

在这种情况下,您可以忽略< -- fallback fonts -->下的源,它用于字体的后备逻辑。

我将Letter Press lib用于我的 NonTextView 东西,例如 Buttons 和kianoni fontloader lib用于我的 TextViews,因为在这个 lib 中使用样式比 Letter Press 更容易,我得到了理想的反馈。 这对于那些想要使用除 Roboto 字体之外的自定义字体的人来说非常有用。 所以这是我对字体库的体验。 对于那些想要使用自定义 class 来更改字体的人,我强烈建议使用此代码段创建此 class

 public class TypefaceSpan extends MetricAffectingSpan { /** An <code>LruCache</code> for previously loaded typefaces. */ private static LruCache<String, Typeface> sTypefaceCache = new LruCache<String, Typeface>(12); private Typeface mTypeface; /** * Load the {@link android.graphics.Typeface} and apply to a {@link android.text.Spannable}. */ public TypefaceSpan(Context context, String typefaceName) { mTypeface = sTypefaceCache.get(typefaceName); if (mTypeface == null) { mTypeface = Typeface.createFromAsset(context.getApplicationContext().getAssets(), String.format("fonts/%s", typefaceName)); // Cache the loaded Typeface sTypefaceCache.put(typefaceName, mTypeface); } } @Override public void updateMeasureState(TextPaint p) { p.setTypeface(mTypeface); // Note: This flag is required for proper typeface rendering p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG); } @Override public void updateDrawState(TextPaint tp) { tp.setTypeface(mTypeface); // Note: This flag is required for proper typeface rendering tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG); } }

并像这样使用 class :

 AppData = PreferenceManager.getDefaultSharedPreferences(this); TextView bannertv= (TextView) findViewById(R.id.txtBanner); SpannableString s = new SpannableString(getResources().getString(R.string.enterkey)); s.setSpan(new TypefaceSpan(this, AppData.getString("font-Bold",null)), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); bannertv.setText(s);

也许这有帮助。

您可以使用以下库轻松完成

https://github.com/sunnag7/FontStyler

 <com.sunnag.fontstyler.FontStylerView android:textStyle="bold" android:text="@string/about_us" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="8dp" app:fontName="Lato-Bold" android:textSize="18sp" android:id="@+id/textView64" />

它重量轻且易于实现,只需将您的 fonts 复制到资产文件夹中并使用 xml 中的名称即可。

试试这些简单的步骤。 1.在res文件夹中创建字体文件夹。 2. 将.ttf 文件复制并粘贴到字体文件夹中。 3. 现在给出 xml 中的路径,如下所示。

 android:fontFamily="@font/frutiger"

或者你的文件名是什么。 这就是快乐的代码

 <?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedAttribute"> <font android:font="@font/google_sans_regular" android:fontStyle="normal" android:fontWeight="400" app:font="@font/google_sans_regular" app:fontStyle="normal" app:fontWeight="400" /> <font android:font="@font/google_sans_italic" android:fontStyle="italic" android:fontWeight="400" app:font="@font/google_sans_italic" app:fontStyle="italic" app:fontWeight="400" /> <font android:font="@font/google_sans_medium" android:fontStyle="normal" android:fontWeight="500" app:font="@font/google_sans_medium" app:fontStyle="normal" app:fontWeight="500" /> <font android:font="@font/google_sans_medium_italic" android:fontStyle="italic" android:fontWeight="500" app:font="@font/google_sans_medium_italic" app:fontStyle="italic" app:fontWeight="500" /> <font android:font="@font/google_sans_bold" android:fontStyle="normal" android:fontWeight="600" app:font="@font/google_sans_bold" app:fontStyle="normal" app:fontWeight="600" /> <font android:font="@font/google_sans_bold_italic" android:fontStyle="italic" android:fontWeight="600" app:font="@font/google_sans_bold_italic" app:fontStyle="italic" app:fontWeight="600" /> </font-family>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM