802

所以我想在 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"
 />

看来我在那里所做的不会真的奏效!顺便说一句android:fontFamily="Arial",这是一个愚蠢的尝试!

4

38 回答 38

1724

从 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>
于 2012-11-11T09:22:26.737 回答
246

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

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

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

这里

注意:从 Android 支持库 26.0 开始,您必须声明两组属性( android: 和 app: )以确保您的字体在运行 Api 26 或更低版本的设备上加载。

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

<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"/>

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

-右键单击​​字体文件夹,然后转到新建 > 字体资源文件。将出现新建资源文件窗口。

-输入文件名,然后单击确定。新字体资源 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 自定义字体教程了解更多信息

于 2017-03-23T12:51:32.553 回答
239

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

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

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

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

于 2012-08-26T07:38:39.990 回答
108

我不得不解析/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;
        }

    }
}

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

一个不完整的小例子:

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();
于 2015-04-09T08:38:04.337 回答
52

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

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

请注意,您只能在调用 setContentView() 后运行此代码。此外,Android 仅支持某些字体,并且应为 a.ttf (TrueType).otf (OpenType)格式。即使这样,某些字体也可能无法使用。

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

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

于 2012-08-26T07:42:35.310 回答
31

以编程方式设置 Roboto:

paint.setTypeface(Typeface.create("sans-serif-thin", Typeface.NORMAL));
于 2015-08-06T22:59:40.077 回答
30

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

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

您可以在哪里SANS_SERIF使用:

  • DEFAULT
  • DEFAULT_BOLD
  • MONOSPACE
  • SANS_SERIF
  • SERIF

您可以在哪里ITALIC使用:

  • BOLD
  • BOLD_ITALIC
  • ITALIC
  • NORMAL

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

于 2014-10-03T19:21:58.020 回答
27

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

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

textView!!.typeface = ResourcesCompat.getFont(context!!, R.font.avenir_next_regular)
于 2020-09-20T17:59:01.890 回答
25

它与 相同android:typeface

内置字体有:

  • 普通的
  • 衬线
  • 等宽

参见android:typeface

于 2012-08-26T07:41:59.970 回答
16
Typeface typeface = ResourcesCompat.getFont(context, R.font.font_name);
textView.setTypeface(typeface);

以编程方式从 res>font 目录轻松地将字体设置为任何文本视图

于 2019-06-04T05:05:30.420 回答
16

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

textView.setTypeface(ResourcesCompat.getFont(this, R.font.lato));
于 2019-10-08T08:18:39.903 回答
15

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

于 2014-07-06T13:50:38.837 回答
15

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

转到文件->新建->新建资源目录 选择字体

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

下载您的字体 (.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); 
于 2019-10-09T07:25:23.893 回答
12

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

XML可以做的是

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

除此之外,你不能在 XML 中使用字体。:)

因为Arial您需要在代码中设置字体。

于 2012-08-26T07:38:37.797 回答
12

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

<!--++++++++++++++++++++++++++-->
<!--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

于 2015-04-23T21:52:04.407 回答
9

动态地,您可以使用这个在 xml 中设置类似于 android:fontFamily 的 fontfamily,

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

这些是使用的默认字体系列列表,通过替换双引号字符串“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中,您可以在此默认字体系列中参考有关默认字体的更多信息

于 2017-07-26T12:57:24.837 回答
7

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

属性窗口 属性窗口

谷歌字体 谷歌字体

于 2019-11-12T15:43:22.487 回答
6

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

在 *.xml 中,您可以将常用字体与以下功能结合起来,而不仅仅是字体:

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

有了这两种风格,在任何其他情况下都不需要使用字体。fontfamily&textStyle 的组合范围更大。

于 2014-04-08T10:17:21.070 回答
5

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”可用于设置内置字体的所有字体,而“typeface”仅提供“sans-serif”“serif”和“monospace”(世界三大类字体类型)的典型字体.
  4. 当只设置“textStyle”时,我们实际上设置了默认字体和指定样式。有效值为“正常”“粗体”“斜体”和“粗体|斜体”。
于 2015-03-04T08:21:27.140 回答
5

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

在此处输入图像描述

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

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

在此处输入图像描述

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

在此处输入图像描述

于 2019-12-05T09:55:30.790 回答
4

这是在某些情况下可以工作的更简单的方法。原理是在你的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 中)。

于 2016-08-09T09:47:41.857 回答
4

试试这个:

TextView textview = (TextView) findViewById(R.id.textview);

Typeface tf= Typeface.createFromAsset(getAssets(),"fonts/Tahoma.ttf");
textview .setTypeface(tf);
于 2019-02-16T05:26:42.797 回答
4

要通过程序设置字体,请编写...

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

名称“sans-serif-condensed”是从 fonts.xml 文件中引用的,该文件应该在 app--> res--> values 文件夹中创建,并且其中包含字体。

<?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>

希望这很清楚!

于 2020-06-17T08:36:10.840 回答
3
<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>
于 2016-02-19T07:33:44.243 回答
3

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

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 使用这个自定义类,如下所示:-

   <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"
        />
于 2017-05-10T06:51:48.990 回答
2

我只想提一下,Android 内部字体的地狱即将结束,因为今年在 Google IO 上我们终于得到了这个 -> https://developer.android.com/preview/features/working-with-fonts。 html

现在有一个新的资源类型字体,您可以将所有应用程序字体放在 res/fonts 文件夹中,然后使用 R.font.my_custom_font 访问,就像您可以访问字符串res 值、可绘制res 值等一样。您甚至有机会创建font-face xml 文件,该文件将设置您的自定义字体(关于斜体、粗体和下划线 attr)。

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

于 2017-06-02T10:05:44.850 回答
2

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

android:fontFamily="@font/my_font_in_font_folder"
于 2019-12-31T09:14:02.037 回答
2

您可以像这样定义自定义 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。

于 2020-09-07T21:58:09.530 回答
1

你这样设置风格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"
于 2015-02-12T11:58:08.603 回答
1

对于 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>
于 2018-11-04T08:03:31.323 回答
1

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

并将其添加到 TextView 为:

科特林

val font_path = "fonts/my_font.otf"  

myTypeface = Typeface.createFromAsset(MyApplication.getInstance().assets, font_path)

textView.typeface = myTypeface

爪哇

String font_path = "fonts/my_font.otf";
Typeface myTypeface = Typeface.createFromAsset(MyApplication.getInstance().assets, font_path)
textView.setTypeface(myTypeface);
于 2019-02-01T15:17:33.670 回答
1

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

    implementation 'uk.co.chrisjenx:calligraphy:2.3.0'
于 2019-03-15T10:33:54.320 回答
1

您还可以使用setTextAppearance(需要 API 16)更改标准字体,请参阅https://stackoverflow.com/a/36301508/2914140

<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);
}
于 2019-05-27T14:27:03.610 回答
0

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

/system/etc/fonts.xml(适用于 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>

tag的 name 属性定义name="sans-serif"family你可以在 android:fontFamily 中使用的值。

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

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

于 2015-08-03T09:42:44.443 回答
0

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

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

并使用这样的类:

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

也许这有帮助。

于 2015-08-03T10:21:59.160 回答
0

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

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" />

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

于 2017-05-29T13:19:25.287 回答
0

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

 android:fontFamily="@font/frutiger"

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

于 2018-03-26T05:30:16.033 回答
0
<?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>
于 2022-02-16T00:30:59.003 回答