当前位置: 首页 > 知识库问答 >
问题:

运行时异常:未找到我尝试过的所有字体的字体-Android

曾绯辞
2023-03-14

我有一个自定义扩展的文本视图,我在应用程序中使用它来自定义字体,但由于某种原因,我一直遇到运行时异常,程序无法找到有问题的字体。

我使用的目录格式是main

我到处寻找解决方案,但他们似乎都在寻找相同的答案。

CustomFontTextView。java:

public class CustomFontTextView extends TextView {

    public CustomFontTextView(Context context) {
        super(context);
        applyCustomFont(context);
    }

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

    public CustomFontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        applyCustomFont(context);
    }

    private void applyCustomFont(Context context) {
        Log.e("it gets here", "custom font");
        Typeface customFont = FontCache.getTypeface("Roboto-Italic.ttf", context);
        setTypeface(customFont);
    }
}

FontCache。Java语言

class FontCache {

    private static HashMap<String, Typeface> fontCache = new HashMap<>();

    static Typeface getTypeface(String fontname, Context context) {
        Typeface typeface = fontCache.get(fontname);
        if (typeface == null) {
            try {
                typeface = Typeface.createFromAsset(context.getAssets(), "fonts/" + fontname);
            } catch (Exception e) {
                Log.e("failed", e.getMessage());
            }
            fontCache.put(fontname, typeface);
        }
        return typeface;
    }
}

XML:

 <icn.premierandroid.misc.CustomFontTextView
            android:id="@+id/switch_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textSize="14sp"
            android:textColor="@color/colorPrimary"
            android:gravity="center_horizontal"
            android:text="@string/are_you_over_18_years_old"/>

我已经尝试了不同的格式,如. otf和不同的字体,如Roboto-Italic.ttf和另一个来自dafont.com的随机称为Sunset-Clouds.ttf,但我仍然收到错误消息,这是怎么回事?这应该是工作。我甚至更新了所有插件,如Gradle、Grad-Wrapper发行版和Android gradle插件,以防万一。

我还尝试了一种方法:

    AssetManager am = context. getApplicationContext(). getAssets();
    Typeface font = Typeface.createFromAsset(
    am, String.format(Locale.US, "fonts/%s", "portrait-light.ttf"));

我错过了什么吗?

更新:

移除catch将显示此stacktrace。

进程:icn.premierandroid,PID:3829java.lang.RuntimeException:无法启动活动ComponentInfo{icn.premierandroid/icn.premierandroid.RegisterActivity}:android.view.InflateException:二进制XML文件行#100:错误inflating类icn.premierandroid.misc.CustomFontTextView atandroid.app.ActivityThread.performLaunchActive(ActivityThread.java:2702)atandroid.app.ActivityThread.handleLaunchActive(ActivityThread.java:2767)......

引起:android.view.InflateException:二进制XML文件行#100:错误inflating类icn.premierandroid.misc.CustomFontTextViewandroid.view.LayoutInflater.createView(LayoutInflater.java:640)android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:750)android.view.LayoutInflate. rInflate(LayoutInflater.java:813)

.....

引起:java.lang.reflect.InvocationTargetExceptionjava.lang.reflect.Constructor.new实例(本机方法)java.lang.reflect.Constructor.new实例(Constructor.java:288)android.view.LayoutInflater.createView(LayoutInflater.java:614)

......

原因:java.lang.RuntimeException:字体资产找不到字体/GleegooRegular.ttfandroid.graphics.Typeface.createFromAsset(Typeface.java:272)在icn.premierandroid.misc.FontCache.getTypeface(FontCache.java:21)在icn.premierandroid.misc.CustomFontTextView.applyCustomFontTextView.java:28)在icn.premierandroid.misc.CustomFontTextView.(CustomFontTextView.java:18)在java.lang.reflect.Constructor.new实例(本机方法)

.....

更新2:

好吧,这有一个奇怪的解决方法。显然,android studio不喜欢将资产直接添加到应用程序/src/main中的主文件夹中。您需要先将其添加到app/src/main/res文件夹中,然后将其移动到主文件夹中。我不知道为什么会这样,但它解决了我的问题。

共有3个答案

巫马昆琦
2023-03-14

试试这个。。。。

put .ttf fonts in app > assets > fonts > Roboto-Italic.ttf

然后在onCreate方法中,

Typeface Roboto = Typeface.createFromAsset(getAssets(),
            "fonts/Roboto-Italic.ttf");

并在文本视图中设置字体等

textview.setTypeface(Roboto);
越琦
2023-03-14

我们为我们的需要编写了这个类。它允许使用属性设置我们的自定义字体,如下所示:

app:customFont="Roboto-Medium.ttf"

希望您觉得它有用:

public class TextViewFonted extends TextView {
    private static final String TAG = "TextViewFonted";

    public TextViewFonted(Context context) {
        super(context);
    }

    public TextViewFonted(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewFonted(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewFonted);
        String customFont = a.getString(R.styleable.TextViewFonted_customFont);
        if (customFont == null) customFont = "Roboto-Regular.ttf";
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
            tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface", e);
            return false;
        }

        setTypeface(tf);  
        setLineSpacing(getTextSize() * 0.3f, 0.75f);
        return true;
    }
}

为了能够使用这个自定义属性,您应该将其添加到属性中。xml下一个块(因此R.styleable.TextViewFonted\u customFont将起作用):

 <declare-styleable name="TextViewFonted">
        <attr name="customFont" format="string"/>
 </declare-styleable>

在本例中,我们将字体放在资产的根文件夹中,但您可以在方法setCustomFont()中更改此行为

使现代化

例如,要添加此字体,我们使用

app:customFont="Comfortaa-Bold.ttf"
郭彬郁
2023-03-14

我认为真正的问题是您尚未配置资产文件夹。如果有,则在项目视图中显示如下:

或者在Android视图中这样:

因此,您应该简单地将此文件夹添加为Studio中的资产文件夹:单击项目结构窗口(或按Alt 1),然后按Alt插入并选择文件夹/资产文件夹。然后将您的字体放在那里。

OP更新:

好吧,所以有一个奇怪的解决方法。显然android工作室不喜欢您将资产文件夹直接添加到app/src/main中的主文件夹中。您需要先将其添加到app/src/main/res文件夹中,然后将其移动到主文件夹。不知道为什么会这样,但它解决了我的问题。

 类似资料:
  • 问题内容: 在Eclipse中运行JUnit测试时出现此错误: 尽管我正在使用maven,但我尝试在类路径中添加库,而JUnit库位于POM依赖项中。 我已经尝试清理项目,并使用Eclipse的JUnit插件创建了一个新的JUnit测试用例,但仍然遇到相同的错误。 问题答案: 出现这种情况的原因是,使用时只有源代码正在编译(我使用的是maven 3.1.0,所以我不确定它是否始终如此)。 如果运行

  • 当我尝试以编程方式将资产中的.ttf文件中的自定义字体设置为android应用中的按钮时,它返回由以下原因引起的错误:java.lang.RuntimeException:font asset找不到Fonts/MenuButton.ttf。Assets文件夹在主目录中,我使用了以下代码:Typeface tpf=Typeface.createFromAsset(this.getAssets(),“

  • 显示 iOS 所支持的所有字体,方便开发者查看。 [Code4App.com]

  • 问题内容: 我正在执行以下几行: 奇怪的情况。如果我仅使用一个实例执行它,则效果很好,但是如果我与多个实例并行执行(一个mdb的实例),则第一个实例将被执行而没有任何异常,其余所有实例都会收到此错误: 知道会导致什么吗?以及它是如何第一次工作的,但是对于所有其他实例却没有? 谢谢, 射线。 问题答案: 该错误消息通常告诉您查询没有返回结果。如此失败。 如果期望空查询结果,请考虑使用并测试结果:

  • 我决定在我的项目中使用可下载字体。我实现了指南中建议的所有内容。 下一步,当我尝试从ResourcesCompat获取字体时,出现了以下问题: 在那之后,我总是得到这样的体验: 如何解决这个问题? PS: support-compat库v27 min sdk 16 通过ResourcesCompat解决方案。FontCallback在我的情况下不是一个好方法 问题发生在有和没有Google Pla

  • 目前,我正在使用头盔和地形在GCP上部署我的詹金斯。这是我的地形代码: 但当我尝试在管道上运行docker命令时,我得到了以下错误: [vision_front_new_master-pth4udtqvsas7vicpco2ufhiem6b37lqylejt5bmat36ayx77ka]运行shell脚本 docker拉节点:碳 /home/jenkins/workspace/vision\u f