“本地字体无法进行”只对某些人(“Native typeface cannot be made” o

2019-06-18 11:43发布

我改变了一些元素的字体字体的应用程序。 它适用于大多数人,但也许试图改变字体时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);

Answer 1:

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

Typeface.createFromAsset泄漏资产流

凡也是这个错误报告解决方法:

我改变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);
        }
    }
}


Answer 2:

我跟着一些在这里找到了解决方案,但没有成功。 我认为这是一些真正的默默无闻,程序员经常做。 然后地方我读它可能与字体路径,疑难杂症:

代替:

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

我更改为:

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

而我的文件是在资产/字体/ blanch_caps.ttf。 没有它就像一个魅力!



Answer 3:

此错误想出了当字体是在图书馆资源文件夹。 当我它复制到这是使用这个库的应用程序的资产,该错误消失。

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

这里有一些其他情况: 发行使用自定义字体时- “本地字体不能言”



Answer 4:

我用这个有很多挣扎。 我想尽一切可能性,并没有什么帮助。 最后,要的问题是其他地方。 如果您正在构建与摇篮您的项目,不要忘记在的build.gradle文件中添加这些行。 这在我的情况下解决了这个问题。

    sourceSets {
    main {
        assets.srcDirs = ['assets']
    }
}


Answer 5:

您必须创建SRC内部资产的文件夹-在AndroidStudio> 。 这样的工作!



Answer 6:

对我来说,它是基于字体的文件名。 出于某种原因,它被命名为FontName..ttf

我不知道为什么双点在那里 - 我抬头一看原来的字体和他们在我的Windows \字体作为FontName..ttf文件夹中。 显然窗户也没在意,而Android吓坏了。 我重命名的文件,而现在一切都高兴。



Answer 7:

对于我来说,我已经发现Assets文件夹位于/main/java/assets ,但他们必须在/main/assets



Answer 8:

较低的情况下,这样做:

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

请记住,也重命名文件。



Answer 9:

更改此一个

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

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


Answer 10:

我只是碰到了这个问题,当我用的是MagicTextView通过qwerjk。 我试图把MTV类在库中,并在我的主要项目中使用它。 下面是我如何开始工作:

  1. 在主要项目资产文件夹,创建子文件夹名为字体
  2. 在TTF文件复制到资产/ fonts文件夹。 我的文件名是驼峰(如ReservoirGrunge.ttf)等瓶盖或没有端点似乎并不重要。
  3. 在我的主要项目中,我从膨胀的XML MTV视图。 确保MagicTextView指向正确的库路径。 例如,我的MTV类库是com.library.library_magictextview.MagicTextView所以我的主视图的XML不得不读:

      <com.library.library_magictextview.MagicTextView android:textSize= "50dp" android:textColor= "#ffffffff" android:layout_width= "fill_parent" android:layout_height= "wrap_content" android:textStyle= "bold" android:padding= "20dp" android:gravity= "center" r:strokeColor= "#FFff0000" r:strokeJoinStyle= "miter" r:strokeWidth= "5" r:typeface= "ReservoirGrunge" android:text= "BobDillon" /> 


Answer 11:

在我们的情况,我们已聘请命中与缓存解决方案。 我们介绍的是,我们在测试的同一个try块内OTF文件和TTF文件的问题,这显然是打算如果你正在寻找获得TTF失败对OTF的第一次尝试),但我认为它值得张贴只是柜面它滑倒通过别人的通知,而他们可能试图相同的解决方案。

protected static Typeface getTypeface(Context p_context, String p_fontName){
    Typeface tf = null;
    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".otf");
    }catch(Exception e) {}

    if( tf != null ) return tf;

    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".ttf");
    }catch(Exception e) {}

    return tf;
}


Answer 12:

在我来说,我刚刚删除的资产文件夹(我手动创建)和刚刚创建使用向导一个新的。 显然,这不是理解为财产文件夹,但读作只是一个普通文件夹等getAssets()没有工作,给我的错误。



Answer 13:

在Android Studio中:你有什么对我来说是把TTF文件直接到资产的文件夹,而不字体的子文件工作,它没有与子文件夹中工作((getAssets(),“字体/ oldengl.ttf”)没有工作时,我在的src / main /资产/字体的TTF)。 此工作原理:SRC /主/资产/ oldengl.ttf字样CustomFont的= Typeface.createFromAsset(getAssets(), “oldengl.ttf”);



Answer 14:

我在这个问题跑,当我输入这是为了支持这两种风格的Eclipse项目和Android工作室的风格项目的模块。

我得到了我的问题,由AS-设置源移除资产解决

defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName '1.0'

        sourceSets {
            main {
                java.srcDirs = ['src']
                res.srcDirs = ['res']
                //assets.srcDirs = ['assets']//commented this out because modlue was not having this directory
                manifest.srcFile 'AndroidManifest.xml'
            }
        }
    }

或到Android工作室风格转换的项目也可以解决我想这个问题。



Answer 15:

在我的情况下,

我只是用以前的代码。所以我忘了在资产文件夹中的字体文件..

但我不能老是想出2小时..

可能的情况下,这个错误,

  1. 字体文件丢失
  2. 错误的字体名称或错误的字体扩展

为前: 字体/roboto.ttf而不是字体/ roboto.otf



文章来源: “Native typeface cannot be made” only for some people