web-dev-qa-db-ja.com

「RuntimeException:ネイティブの書体は作成できません」フォントをロードするとき

ガイド here に従って、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

私はブログの1つで正常に使用されたフォントMolot.otfを使用しています。また、別のカスタムフォントですが、TrueType形式のpredator.ttfを使用しています。

関連コード:

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: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>

これは何が原因ですか?それはブログの人々のために働いたので、なぜ私ではないのですか? APIに何か大きな変更があったので、これができなくなりましたか?

64
TheLQ

AndroidはOpenType(OTF)をサポートせず、TrueType(TTF)のみをサポートしているため、Molot.otfフォントはおそらく機能しません。冒頭の文章でリンク先のブログ投稿を両方とも書きました(一方は他方の海賊版です)。彼らはMolot.otf

(ところで、私はその投稿のフォーマットを多少修正しました-AndroidGuysはWordPressホストを変更し続けるため、古い投稿はフォーマットに関してひどく壊れています)。

[〜#〜] edit [〜#〜]:コメントで述べたように、Android [〜#〜] does [〜#〜]がOTFをサポートするようになりました。

48
CommonsWare

また、同じエラーが発生し、解決策があります。

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf")

fonts/Molot.otf in assets/fontsフォルダーのEclipse。

実行した後。

あなたがそれを正常に実行できない場合、あなたは

27
phuongnv

残念ながら、書体を作成することはできませんエラーはそれほど明確ではなく、多くの問題が発生した結果である可能性があります。 2つのことを確認することが重要です。

  • 最初で最も重要なもの:ファイルが見つかりました!
  • フォントはデバイスで有効です。

最善の方法は、既知の有効なフォントファイルのフォントファイルを変更することです。
失敗した場合、それが最初の問題です。
そうでない場合は2番目なので、FontForgeを処理するか、別のフォントを探す必要があります。

10
mamuso

フォントの名前と拡張子を確認してください。大文字と小文字が区別され、おそらくすべて大文字です。例えば。

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF")
9
marcieng

ご参考までに。クラッシュの私の理由は、Eclipseによって引き起こされた何らかの理由です。私がやったのは、プロジェクトをきれいにして再び実行するだけで、その後は動作します。

最初に、テストプロジェクトでカスタムフォントを試しましたが、これを使用していくつかの新しい機能を試しました。しかし、上記のようになるまで、私が取り組んでいるプロジェクトでは動作しませんでした。

できるだけ多くの方法を試してください。

6
Michelle

AndroidはタイプフェイスのOTFファイルをサポートしています。この問題に直面している場合は、fonts.putフォントの正しいパスをアセットフォルダー内のフォルダーフォントに設定し、以下のようにタイプフェイスを作成してください。

Typeface typeface = Typeface.createFromAsset(getAssets(), "font/StencilStd.otf");
TextView text = (TextView) findViewById(R.id.textView);
text.setTypeface(typeface);
6
Hitesh Raviya

@deng彼の答えは私のために働いた」

フォントの名前と拡張子を確認してください。大文字と小文字が区別され、おそらくすべて大文字です。例えば。

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF")
4
user1693108

バイナリmodの「Fontlab」ソフトウェアでフォントを編集する必要があります。

4
ali shekari

Androidは、TypefacesのOTFファイルをサポートしています。この問題に直面している場合は、フォントの正しいパスを設定していることを確認してください。たとえば、fontname.otfファイルがある場合は、アセット内のフォルダーフォントに入れますフォルダを作成し、次のような書体を作成します。

Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/fontname.otf");

(パス引数は「/」で始まってはなりません)、ファイル名には特殊文字や「-」を含めてはならず、小文字にする必要があります

1