我应用了一个自定义字体TextView,但它似乎没有改变字体。

这是我的代码:

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
    myTextView.setTypeface(myTypeface);

谁能帮我摆脱这个问题?


当前回答

七年后,你可以改变整个应用程序的textView或你想要的很容易通过使用android。支持库26++。

E.g:

创建字体包app/src/res/font,并将字体移动到其中。

在你的应用主题中添加一个fontFamily:

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

仅用于textView的示例:

<style name="fontTextView" parent="@android:style/Widget.TextView">
    <item name="android:fontFamily">monospace</item>
</style>

在你的主题中加入:

<item name="android:textViewStyle">@style/fontTextView</item>

目前它工作在8.1到4.1 API果冻豆,这是一个广泛的范围。

其他回答

随着Android 8.0在应用程序中使用自定义字体变得容易下载字体。 我们可以直接将字体添加到项目文件夹中的res/font/文件夹中,这样一来,字体就会自动在Android Studio中可用。

现在将fontFamily属性设置为字体列表或单击更多并选择您选择的字体。这将添加tools:fontFamily="@font/your_font_file"行到你的TextView。

这将自动生成几个文件。

1. 在values文件夹中,它将创建fonts_certs.xml。

2. 在Manifest中,它会添加这样的行:

  <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" /> 

3. preloaded_fonts.xml

<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/open_sans_regular</item>
        <item>@font/open_sans_semibold</item>
    </array>
</resources>

不幸的是,这个问题没有好的解决方案。

我已经看到了许多关于使用自定义TextView的文章,但他们忘记了,这不仅是textviews,可以实现字体&有textviews隐藏在其他视图无法访问的开发人员;我还没开始讲Spannable呢。

你可以使用外部字体工具,比如:

书法字体工具

但是这在应用程序的创建上循环每个视图,甚至这个实用程序错过了一些视图(ViewPager呈现正常字体),然后你有问题,当谷歌更新他们的构建工具,这偶尔会崩溃,因为它需要针对已弃用的属性。由于使用Java的反射,它也有点慢。

这真的是由谷歌来解决的。Android需要更好的字体支持。如果你看看iOS的解决方案,他们实际上有100种字体可供选择。想要自定义字体?简单地丢一个TFF,它是可用的..

目前,我们目前仅限于谷歌提供的服务,这是非常有限的,但幸运的是,移动优化。

我知道已经有了很好的答案,但这里有一个完全工作的实现。

这是自定义文本视图:

package com.mycompany.myapp.widget;

/**
 * Text view with a custom font.
 * <p/>
 * In the XML, use something like {@code customAttrs:customFont="roboto-thin"}. The list of fonts
 * that are currently supported are defined in the enum {@link CustomFont}. Remember to also add
 * {@code xmlns:customAttrs="http://schemas.android.com/apk/res-auto"} in the header.
 */
public class CustomFontTextView extends TextView {

    private static final String sScheme =
            "http://schemas.android.com/apk/res-auto";
    private static final String sAttribute = "customFont";

    static enum CustomFont {
        ROBOTO_THIN("fonts/Roboto-Thin.ttf"),
        ROBOTO_LIGHT("fonts/Roboto-Light.ttf");

        private final String fileName;

        CustomFont(String fileName) {
            this.fileName = fileName;
        }

        static CustomFont fromString(String fontName) {
            return CustomFont.valueOf(fontName.toUpperCase(Locale.US));
        }

        public Typeface asTypeface(Context context) {
            return Typeface.createFromAsset(context.getAssets(), fileName);
        }
    }

    public CustomFontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);

        if (isInEditMode()) {
            return;
        } else {
            final String fontName = attrs.getAttributeValue(sScheme, sAttribute);

            if (fontName == null) {
                throw new IllegalArgumentException("You must provide \"" + sAttribute + "\" for your text view");
            } else {
                final Typeface customTypeface = CustomFont.fromString(fontName).asTypeface(context);
                setTypeface(customTypeface);
            }
        }
    }
}

这里是自定义属性。这应该进入你的res/attrs.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomFontTextView">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

下面是你如何使用它。我将使用一个相对布局来包装它并显示customAttr声明,但它显然可以是您已经拥有的任何布局。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:customAttrs="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.mycompany.myapp.widget.CustomFontTextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="foobar"
         customAttrs:customFont="roboto_thin" />

</RelativeLayout>

在Mobiletuts+上有一个关于Android文本格式的很好的教程。快速提示:自定义Android字体

编辑:现在我自己测试了一下。这是解决方案。你可以使用一个子文件夹称为字体,但它必须在资产文件夹,而不是在res文件夹。所以

资产/字体

还要确保字体结尾。我是说字体文件本身的结尾都是小写。换句话说,它不应该是myfont。ttf,而应该是myfont。ttf,这种方式必须小写

七年后,你可以改变整个应用程序的textView或你想要的很容易通过使用android。支持库26++。

E.g:

创建字体包app/src/res/font,并将字体移动到其中。

在你的应用主题中添加一个fontFamily:

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

仅用于textView的示例:

<style name="fontTextView" parent="@android:style/Widget.TextView">
    <item name="android:fontFamily">monospace</item>
</style>

在你的主题中加入:

<item name="android:textViewStyle">@style/fontTextView</item>

目前它工作在8.1到4.1 API果冻豆,这是一个广泛的范围。