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

“本机字体无法制作”仅适用于某些人

呼延英奕
2023-03-14

我有一个应用程序,可以更改某些元素的字体。这对大多数人来说都很好,但可能有0.5%的人在尝试更改字体时会出现异常。堆栈跟踪的重要部分是:

Caused by: java.lang.RuntimeException: native typeface cannot be made
at android.graphics.Typeface.<init>(Typeface.java:147)
at android.graphics.Typeface.createFromAsset(Typeface.java:121)

正如我所说,它适用于大多数人,所以我认为这不是字体文件或我的代码的问题。关于如何解决这个问题,有什么建议吗?

编辑:这是我的代码:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                                 "fonts/CharisSILR.ttf");
TextView tv;
tv = ((TextView) findViewById(R.id.searchPronunciationTitle));
tv.setTypeface(phoneticFont);

共有3个答案

太叔志文
2023-03-14

当字体在库资产文件夹中时出现此错误。当我将其复制到使用此库的应用程序的资产中时,错误消失了。

似乎无法导入资产:Android Library资产文件夹不会被复制

还有其他一些情况:使用自定义字体时出现问题-“无法生成本机字体”

尹善
2023-03-14

我遵循了这里找到的一些解决方案,但没有成功。我认为这是一件非常晦涩的事情,就像程序员经常做的那样。然后我在某个地方读到它可能与字体路径有关,明白了:

而不是:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "blanch_caps.ttf");   

我改成:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/blanch_caps.ttf");   

和我的文件是在资产/字体/blanch_caps.ttf.不是它的作品像一个魅力!

吴凯泽
2023-03-14

Android操作系统的这个bug可能是您出现问题的原因:

资产ypeface.create泄露资产流

此bugreport中还有哪些解决方法:

我修改了HTH的变通方法,使该方法不采用字体路径或格式。字体资源的完整路径必须作为参数提交。我还将对createFromAsset()的调用包装在一个try-catch块中,以便如果找不到资产,get()方法将返回null。

public class Typefaces {
    private static final String TAG = "Typefaces";

    private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {
                    Log.e(TAG, "Could not get typeface '" + assetPath
                            + "' because " + e.getMessage());
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}
 类似资料:
  • REST API请求:EmployeeRequest。java id、名称、sal、位置-- 员工负责。java id、名称、sal、位置-- /api/employee 我不想在回复中使用除ID以外的其他字段 实际:`{id:“123”,“name:“null”,“sal:“null”,“location:“null”}但我只想要response id,而不是POST response的其他字段

  • 问题内容: 我有一些通用的设置代码,已将这些代码分解为标记为的方法。但是,不必为每个测试都运行所有这些代码。有没有一种标记方式,使得该方法仅在某些测试之前运行? 问题答案: 只需将不需要安装代码的测试移到单独的测试类中即可。如果您有一些测试通用的其他代码,可以帮助保留这些代码,请将其移到帮助程序类中。

  • 问题内容: 我有一个包含几个容器的容器。其中三个用于我的应用程序(客户端,服务器和数据库),其余用于各种开发工具(例如psql,npm,manage.py等)。当我完成所有这些操作时,但是我只希望三个主要功能开始。由于已指定了链接,因此只能从这三个开始,但输出仅来自该一个容器。因此,有没有一种方法可以执行以下任一操作: 告诉docker-compose哪个容器应该由以下对象启动 从所有链接的容器获

  • 我正在编辑从tesseract ocr收到的一些电子邮件。 以下是我的代码: 但输出不正确。 输入: 输出: 但是当我在每次替换后将结果赋给一个新的字符串时,它工作得很好。为什么在同一个字符串中连续赋值不起作用?

  • 问题内容: 我正在尝试使用在互联网上找到的字体,但是问题是我得到了带有“无法制作本机字体”的FC。 这是我的ListVIew的getView中的代码: 谁能告诉我为什么我可以使用自定义rom?您可以在这里获取它..文件是.ttf 问题答案: 字体文件由于某种原因损坏或不受支持。您可以将其拖放到SD卡上并从文件中加载,以确保资产没有问题。

  • 我需要让对象的某些部分序列化默认值,而有些部分不序列化。 在下面的帖子中,我了解了如何根据类型做到这一点:Json。NET:如何使DefaultValueHandling仅适用于某些类型? 但是这个解决方案只适用于类型,不会是递归的。 预期行为: 重新序列化时: ContractProvider中是否有我可以重写的内容,或者我可以添加到成员或类中的属性来选择DefaultValueHandling