加载字体时出现“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参数不应该以“/”开头),文件名不应该包含特殊字符或“ – ”,而应该放在小写字母