“只能为某些人使用原生字体”

我有一个应用程序,改变了一些元素的字体字体。 对大多数人来说,它的效果很好,但是当尝试更改字体时,可能有0.5%会发生exception。 堆栈跟踪的重要部分是这样的:

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) 

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

编辑:这是我的代码:

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

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

Typeface.createFromAsset泄漏资产stream

这个bugreport在哪里也是一个解决方法:

我改变了HTH的解决方法,以便该方法不承担字体path或格式。 字体资源的完整path必须作为参数提交。 我还在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); } } } 

我跟着这里find的一些解决scheme,没有成功。 像程序员经常做的那样,我认为这是一件非常模糊的事情。 然后我读的地方可能与字体path有关,gotcha:

代替:

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

我改成:

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

而我的文件是assets / fonts / blanch_caps.ttf。 不是它像一个魅力工程!

字体在库资源文件夹中时出现此错误。 当我把它复制到正在使用这个库的应用程序的资源中时,错误消失了。

看来资产无法导入: Android库资产文件夹不会被复制

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

我一直在努力。 我尝试了所有可能性,没有任何帮助 最后,问题在别的地方。 如果您使用Gradle构build项目,请不要忘记在build.gradle文件中添加这些行。 这解决了我的情况下的问题。

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

您必须在AndroidStudio的src – > main中创buildassets文件夹。 这样工作!

在我的情况下,它是基于字体的文件名。 由于某种原因,它被命名为FontName..ttf

我不知道为什么双点在那里 – 我查了原来的字体,他们在我的windows \ fonts文件夹中的FontName..ttf。 Windows显然不在乎,但Android吓坏了。 我重命名了这个文件,现在都很开心。

对于我的情况,我发现资产文件夹位于/main/java/assets但他们必须在/main/assets

小写:

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

记得也要重命名文件。

改变这一个

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

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

当我使用qwerjk使用MagicTextView时,我遇到了这个问题。 我试图把MTV类放在一个库中,并在我的主要项目中使用它。 以下是我如何工作:

  1. 在主项目资产文件夹中,创build一个名为fonts的子文件夹
  2. 将ttf文件复制到assets / fonts文件夹中。 我的文件名是camelcase(例如ReservoirGrunge.ttf),所以上限或没有上限似乎并不重要。
  3. 在我的主要项目中,我从xml中夸大了MTV视图。 确保MagicTextView指向正确的库path。 例如,我的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" /> 

在我们的情况下,我们采用Hit的解决scheme与caching。 我们介绍的问题是,我们正在同一个try块中testingOTF文件和TTF文件;)如果您希望获得TTF,那么在第一次尝试OTF时显然会失败,但我认为这是值得发布的只要在他们尝试相同的解决scheme时溜过了他人的通知。

 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; } 

在我的情况下,我刚刚删除资产文件夹(我手动创build),只是使用向导创build一个新的。 显然,它不是作为资产文件夹读取,而是作为一个普通的文件夹读取,所以getAssets()没有工作,给了我错误。

在Android工作室:什么工作对我来说是把ttf文件直接到资产文件夹没有字体的子文件夹,它没有与子文件夹((getAssets(),“字体/ oldengl.ttf”)没有工作时我在src / main / assets / fonts中有ttf)。 这个工程:src / main / assets / oldengl.ttf Typeface customfont = Typeface.createFromAsset(getAssets(),“oldengl.ttf”);

当我导入一个模块,这意味着支持eclipse样式项目和android studio样式项目时,我遇到了这个问题。

我通过从源设置中删除资源来解决我的问题,

 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 studio风格也可以解决我猜测的问题。

就我而言,

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

但我不能弄清楚2个小时

可能出现这种错误的情况,

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

例如: fonts / roboto.ttf而不是fonts / roboto.otf