我有一个应用程序可以更改某些元素的字体字体。它适用于大多数人,但在尝试更改字体时可能会有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);
答案 0 :(得分:68)
Android OS的这个错误可能是您遇到问题的原因:
Typeface.createFromAsset leaks asset stream
此错误报告中的解决方法也在哪里:
我改变了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);
}
}
}
答案 1 :(得分:52)
我按照这里找到的一些解决方案,没有成功。我认为这是一个非常模糊的东西,正如程序员经常做的那样。然后我读到的某个地方可能与字体路径有关,得到了:
而不是:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"blanch_caps.ttf");
我改为:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/blanch_caps.ttf");
我的文件位于assets / fonts / blanch_caps.ttf中。它不像魅力!
答案 2 :(得分:50)
当字体位于库资源文件夹中时出现此错误。当我将其复制到使用此库的应用程序的资产时,错误消失了。
似乎资产无法导入: Android Library assets folder doesn't get copied
以下是其他一些案例:Issue when using a custom font - "native typeface cannot be made"
答案 3 :(得分:25)
我正在努力解决这个问题。我尝试了所有可能性,没有任何帮助最后,问题出在其他地方。如果使用Gradle构建项目,请不要忘记在build.gradle文件中添加这些行。这解决了我的问题。
sourceSets {
main {
assets.srcDirs = ['assets']
}
}
答案 4 :(得分:7)
您必须在AndroidStudio中的 src - &gt; main 中创建资源文件夹。这种方式有效!
答案 5 :(得分:4)
就我而言,它基于字体的文件名。出于某种原因,它被命名为FontName..ttf
我不知道为什么双点在那里 - 我查找了原始字体,它们在我的windows \ fonts文件夹中作为FontName..ttf。 Windows显然并不关心,但Android吓坏了。我重命名了这个文件,现在都很高兴。
答案 6 :(得分:4)
对于我的情况,我发现资产文件夹位于/main/java/assets
,但它们必须位于/main/assets
答案 7 :(得分:2)
小写:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/charissilr.ttf");
请记住也要重命名该文件。
答案 8 :(得分:1)
更改此
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/CharisSILR.ttf");
到
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"CharisSILR.ttf");
答案 9 :(得分:0)
当我使用qwerjk的MagicTextView时,我遇到了这个问题。我试图将MTV类放在库中,并在我的主项目中使用它。以下是我如何使用它:
在我的主项目中,我从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" />
答案 10 :(得分:0)
在我们的情况下,我们使用了Hit的解决方案和缓存。我们引入的问题是我们在同一个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;
}
答案 11 :(得分:0)
在我的情况下,我刚删除了资产文件夹(我手动创建),并使用向导创建了一个新文件夹。显然它不是作为资源文件夹读取,而是只读取普通文件夹,因此getAssets()不起作用并给我错误。
答案 12 :(得分:0)
在android studio中:对我有用的是将ttf文件直接放到assets文件夹而没有字体的子文件夹,它没有使用子文件夹((getAssets(),&#34; fonts / oldengl。 ttf&#34;)当我在src / main / assets / fonts中使用ttf时没有工作。 这工作: 的src / main /资产/ oldengl.ttf 字体customfont = Typeface.createFromAsset(getAssets(),&#34; oldengl.ttf&#34;);
答案 13 :(得分:0)
当我导入一个旨在支持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风格也可以解决我猜的问题。
答案 14 :(得分:0)
就我而言,
我只是使用前面的代码..所以我忘记了资源文件夹中的字体文件..
但我不能弄清楚2个小时..
此错误的可能情况,
- 缺少字体文件
- 错误的字体名称或错误的字体扩展名
醇>
例如: fonts / roboto.ttf 而不是 fonts / roboto.otf