“只能为某些人使用原生字体”
我有一个应用程序,改变了一些元素的字体字体。 对大多数人来说,它的效果很好,但是当尝试更改字体时,可能有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类放在一个库中,并在我的主要项目中使用它。 以下是我如何工作:
- 在主项目资产文件夹中,创build一个名为fonts的子文件夹
- 将ttf文件复制到assets / fonts文件夹中。 我的文件名是camelcase(例如ReservoirGrunge.ttf),所以上限或没有上限似乎并不重要。
-
在我的主要项目中,我从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个小时
可能出现这种错误的情况,
- 字体文件丢失
- 错误的字体名称或错误的字体扩展名
例如: fonts / roboto.ttf而不是fonts / roboto.otf