Java 加载字体时出现“RuntimeException:无法制作本机字体”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3023960/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
"RuntimeException: native typeface cannot be made" when loading font
提问by TheLQ
I am attempting to use a custom font for a TextView on Android, following the guide here. Using the same font, same code, same everything, I get this in adb logcat:
我正在尝试按照此处的指南为 Android 上的 TextView 使用自定义字体。使用相同的字体、相同的代码、相同的所有内容,我在 adb logcat 中得到了这个:
W/dalvikvm( 317): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime( 317): FATAL EXCEPTION: main
E/AndroidRuntime( 317): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.evilx.quacklock/org.evilx.quacklock.MainActivity}: java.lang.RuntimeException: native typeface cannot be made
E/AndroidRuntime( 317): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime( 317): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime( 317): at android.app.ActivityThread.access00(ActivityThread.java:125)
E/AndroidRuntime( 317): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime( 317): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 317): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 317): at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 317): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 317): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 317): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 317): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 317): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 317): Caused by: java.lang.RuntimeException: native typeface cannot be made
E/AndroidRuntime( 317): at android.graphics.Typeface.<init>(Typeface.java:147)
E/AndroidRuntime( 317): at android.graphics.Typeface.createFromAsset(Typeface.java:121)
E/AndroidRuntime( 317): at org.evilx.quacklock.MainActivity.onCreate(MainActivity.java:24)
E/AndroidRuntime( 317): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 317): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime( 317): ... 11 more
W/ActivityManager( 59): Force finishing activity org.evilx.quacklock/.MainActivity
W/ActivityManager( 59): Activity pause timeout for HistoryRecord{43e80368 org.evilx.quacklock/.MainActivity}
D/dalvikvm( 247): GC_EXPLICIT freed 711 objects / 53160 bytes in 20922ms
I'm using the font Molot.otf, which was successfully used in one of the blogs. I'm also using predator.ttf, another custom font but in TrueType format.
我正在使用 Molot.otf 字体,该字体已在其中一个博客中成功使用。我还使用了 Predinner.ttf,这是另一种自定义字体,但采用 TrueType 格式。
Relevant code:
相关代码:
public class MainActivity extends Activity {
// Called when the activity is first created.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf");
TextView tv = (TextView) findViewById(R.id.CustomFontText);
tv.setTypeface(tf);
}
}
and
和
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/CustomFontText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="Here is some text.">
</TextView>
</LinearLayout>
What would be causing this? It worked for the people in the blogs, so why not me? Did something significant change in the API that's preventing me from doing this?
什么会导致这种情况?它对博客中的人有用,那么为什么我不呢?API 中有什么重大变化阻止我这样做吗?
采纳答案by CommonsWare
Android does not support OpenType (OTF), only TrueType (TTF), so your Molot.otf
font probably will not work. I wrote both of those blog posts you link to in your opening sentence (the one is a pirated copy of the other), and they do not use Molot.otf
.
Android 不支持 OpenType (OTF),仅支持 TrueType (TTF),因此您的Molot.otf
字体可能无法使用。我在开头的句子中写了您链接到的这两篇博客文章(一个是另一个的盗版副本),并且它们不使用Molot.otf
.
(BTW, I somewhat repaired the formatting of that post -- AndroidGuys keeps changing WordPress hosts, and so my older posts are terribly broken in terms of formatting).
(顺便说一句,我稍微修复了那个帖子的格式——AndroidGuys 一直在改变 WordPress 主机,所以我的旧帖子在格式方面非常糟糕)。
EDIT: As stated in the comments, Android DOESnow support OTF.
编辑:正如评论指出,Android的DOES现在支持OTF。
回答by phuongnv
I also get the same error and I have solution follow.
我也遇到了同样的错误,我有解决方案。
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf")
you must put fonts/Molot.otf
in assets/fonts
folder in your Eclipse.
你必须把fonts/Molot.otf
在assets/fonts
文件夹中的Eclipse。
after you can Run it.
在你可以运行它之后。
if you can not Run it successfull you can send proplem via
如果你不能成功运行它,你可以通过发送 proplem
回答by mamuso
Unfortunately, the typeface cannot be madeerror is not very specific, and it can be the result of many things going wrong. It's important to check for two things:
不幸的是,字体不能制作错误不是很具体,它可能是许多事情出错的结果。检查两件事很重要:
- The first and most important: The file is found!
- The font is valid in your device.
- 第一个也是最重要的:文件找到了!
- 该字体在您的设备中有效。
The best way is to change your font file for a known valid font file.
If it fails, then it's the first problem.
If not, it's the second, so you will have to deal with FontForge
or look for another font.
最好的方法是将字体文件更改为已知的有效字体文件。
如果失败,那就是第一个问题。
如果没有,那就是第二个,所以你将不得不处理FontForge
或寻找另一种字体。
回答by Michelle
FYI. My reason for the crash is some reason caused by Eclipse. All I did is just cleaning the project and ran again, then it works.
供参考。我崩溃的原因是Eclipse引起的一些原因。我所做的只是清理项目并再次运行,然后它就可以工作了。
Firstly, I tried the custom font in my test project which I use to try some new functions.It worked on the very first time. But it didn't work on the project i'm working on until I did as above.
首先,我在我的测试项目中尝试了自定义字体,我用它来尝试一些新功能。它第一次奏效。但是在我按照上述方法进行之前,它对我正在从事的项目不起作用。
So try as many methods as you can.
所以尽可能多地尝试方法。
回答by marcieng
check font's name and extension. it is case sensitive & probably all caps. eg.
检查字体的名称和扩展名。它区分大小写,可能全部大写。例如。
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF")
回答by ali shekari
You should edit your font with 'Fontlab' Software in binary mod.
您应该使用二进制 mod 中的“Fontlab”软件编辑您的字体。
回答by user1693108
@deng his answer worked for me":
@deng 他的回答对我有用”:
check font's name and extension. it is case sensitive & probably all caps. eg.
检查字体的名称和扩展名。它区分大小写,可能全部大写。例如。
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF")
回答by Alaa Eddine Cherbib
Android does support OTF files for Typefaces, if you're facing this problem, make sure that you're setting the right path for the font, for example, if you have the file fontname.otf, put it in a folder fonts inside assets folder and create the typeface like follows :
Android 确实支持字体的 OTF 文件,如果您遇到此问题,请确保为字体设置正确的路径,例如,如果您有文件 fontname.otf,请将其放在 assets 内的文件夹 fonts 中文件夹并创建如下字体:
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/fontname.otf");
(path argument should not start with "/") and the file name should not include special characters or a "-" and should be in lowercases
(路径参数不应以“/”开头)且文件名不应包含特殊字符或“-”且应为小写
回答by Hitesh Raviya
Android does support OTF files for Typefaces, if you're facing this problem, make sure that you're setting the right path for the font.put font into folder fonts inside assets folder and create the typeface as below :
Android 确实支持字体的 OTF 文件,如果您遇到此问题,请确保为 font.put 字体设置正确的路径到 assets 文件夹中的文件夹 fonts 并创建如下字体:
Typeface typeface = Typeface.createFromAsset(getAssets(), "font/StencilStd.otf");
TextView text = (TextView) findViewById(R.id.textView);
text.setTypeface(typeface);