加载字体时出现“RuntimeException:原生字体无法制作”
我试图在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.access$2300(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
嗯…好吧。 我正在使用字体Molot.otf,成功地在其中一个博客使用。 我也使用捕食者.ttf,另一种自定义字体,但在TrueType格式
相关代码:
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); } }
和
<?xml version =“1.0”encoding =“utf-8”?> <的LinearLayout 的xmlns:机器人= “http://schemas.android.com/apk/res/android” 机器人:方向=“垂直” 机器人:layout_width = “FILL_PARENT” 机器人:layout_height = “FILL_PARENT”> <TextView的 机器人:ID = “@ + ID / CustomFontText” 机器人:layout_width = “WRAP_CONTENT” 机器人:layout_height = “WRAP_CONTENT” 机器人:TEXTSIZE = “30sp” android:text =“这是一些文字。”> </的TextView> </的LinearLayout>
这会造成什么? 它在博客中为人们工作,为什么不是我? API有什么重大的变化,阻止了我这样做?
Android不支持OpenType(OTF),只支持TrueType(TTF),所以你的Molot.otf
字体可能不起作用。 我在你的开头语句(那个是另一个的盗版副本)中写下了你链接到的两篇博文,而且他们不使用Molot.otf
。
(顺便说一句,我有些修复了这个post的格式 – AndroidGuys不断改变WordPress的主机,所以我的旧post格式化方面是非常糟糕的)。
编辑 :如评论中所述,Android现在支持OTF。
我也得到同样的错误,我有解决scheme。
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf")
您必须在Eclipse的assets/fonts
文件夹中放置fonts/Molot.otf
。
之后你可以运行它。
如果你不能运行成功,你可以通过发送prpr
不幸的是, 字体不能做错误不是很明确,而且可能是很多事情出错的结果。 检查两件事情很重要:
- 第一个也是最重要的:文件被find了!
- 该字体在您的设备中有效。
最好的方法是更改您的字体文件为一个已知的有效的字体文件。
如果失败了,那么这是第一个问题。
如果没有,那么这是第二个,所以你将不得不处理FontForge
或寻找另一种字体。
检查字体的名称和扩展名。 它是区分大小写的,可能全部大写。 例如。
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF")
仅供参考。 我之所以会崩溃,是由Eclipse导致的一些原因。 我所做的只是清理项目并重新运行,然后运行。
首先,我在我的testing项目中尝试使用自定义字体来尝试一些新的function,它第一次工作。 但是直到我按照上面的方法完成之后,这个项目才开始工作。
所以尽可能地尝试尽可能多的方法。
你必须用二进制模式下的'Fontlab'软件来编辑你的字体。
@deng他的答案为我工作“:
检查字体的名称和扩展名。 它是区分大小写的,可能全部大写。 例如。
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF")
Android不支持字体的OTF文件,如果你面临这个问题,请确保你设置的字体的正确path,例如,如果你有文件fontname.otf,把它放在一个文件夹内的字体资产文件夹,并创build如下所示的字体:
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/fontname.otf");
(path参数不应该以“/”开头),文件名不应该包含特殊字符或“ – ”,而应该放在小写字母