"只能为某些人制作"原生字体"

use*_*580 74 fonts android typeface

我有一个应用程序,可以更改某些元素的字体字体.它适用于大多数人,但在尝试更改字体时可能会有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)
Run Code Online (Sandbox Code Playgroud)

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

编辑:这是我的代码:

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

Hit*_*sit 68

Android操作系统的这个错误可能是您遇到问题的原因:

Typeface.createFromAsset泄漏资产流

这个bug报告中的解决方法也在哪里:

我改变了HTH的解决方法,以便该方法不采用字体路径或格式.必须将字体资源的完整路径作为参数提交.我还在try-catch块中包含对createFromAsset()的调用,以便在找不到资产时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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.如果我理解正确,那个bug的描述说问题是内存泄漏会引发内存错误.但是,这不是我所看到的:我得到了"本地字体无法制作"的消息,没有内存异常.此外,它看起来失败的用户总是失败,而我的应用程序不使用很多资源. (4认同)

小智 52

我按照这里找到的一些解决方案,没有成功.我认为这是一个非常模糊的东西,正如程序员经常做的那样.然后在某处我读到它可能与字体路径有关,得到:

代替:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "blanch_caps.ttf");   
Run Code Online (Sandbox Code Playgroud)

我改为:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/blanch_caps.ttf");   
Run Code Online (Sandbox Code Playgroud)

我的文件位于assets/fonts/blanch_caps.ttf中.它不像魅力!


Lum*_*mis 50

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

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

以下是其他一些情况:使用自定义字体时出现问题 - "无法制作原生字体"


Mic*_*hal 25

我正在努力解决这个问题.我尝试了所有可能性,没有任何帮助 最后,问题出在其他地方.如果使用Gradle构建项目,请不要忘记在build.gradle文件中添加这些行.这解决了我的问题.

    sourceSets {
    main {
        assets.srcDirs = ['assets']
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在Android Studio(目前为0.8.1)下,我没有必要将行添加到`build.gradle`,但我必须将我的资源文件夹直接放在main下(例如``src\main\assets`) (15认同)
  • 如果我们使用Android studio和gradle - 请观看此内容.资产目录应直接在主要内部.这解决了我的问题.字体名称和字体文件没有任何问题.这一点尤为重要,因为我们使用的字体名称有大/小写,而资产文件名应全部小写. (10认同)

Mad*_*adi 7

您必须在AndroidStudio中的src - > main中创建assets文件夹.这种方式有效!