74

一部の要素のフォントの書体を変更するアプリがあります。ほとんどの人にとってはうまくいきますが、フォントを変更しようとすると、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);
4

15 に答える 15

68

Android OS のこのバグが問題の原因である可能性があります。

Typeface.createFromAsset がアセット ストリームをリークする

このバグレポートの回避策もどこにありますか:

メソッドがフォント パスまたはフォーマットを想定しないように、HTH の回避策を変更しました。フォント アセットのフル パスをパラメーターとして送信する必要があります。また、アセットが見つからない場合に get() メソッドが null を返すように、createFromAsset() の呼び出しを try-catch ブロックにラップしました。

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);
        }
    }
}
于 2012-10-26T12:43:09.047 に答える
52

ここで見つかったいくつかの解決策に従いましたが、成功しませんでした。プログラマーがよくするように、それは本当にあいまいなものだと思いました。それから、私が読んだどこかで、フォントパスに関連している可能性があります。

それ以外の:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "blanch_caps.ttf");   

私は次のように変更しました:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/blanch_caps.ttf");   

私のファイルは assets/fonts/blanch_caps.ttf にあります。それは魅力のように機能しません!

于 2013-07-20T20:35:07.917 に答える
50

このエラーは、フォントがライブラリアセットフォルダにあるときに発生しました。このライブラリを使用していたアプリケーションのアセットにコピーすると、エラーが消えました。

アセットをインポートできないようです: Androidライブラリアセットフォルダがコピーされません

そして、他のいくつかのケースがあります:カスタムフォントを使用するときの問題-「ネイティブ書体を作成できません」

于 2013-01-05T09:47:24.130 に答える
25

私はこれに多くの苦労をしました。私はあらゆる可能性を試しましたが、何も役に立ちません。結局、問題は別の場所にありました。プロジェクトを Gradle でビルドする場合は、build.gradle ファイルにこれらの行を追加することを忘れないでください。これで私の場合の問題は解決しました。

    sourceSets {
    main {
        assets.srcDirs = ['assets']
    }
}
于 2013-08-11T10:19:53.863 に答える
7

AndroidStudioのsrc --> main内に assets フォルダーを作成する必要があります。この方法でうまくいきました!

于 2014-11-18T07:43:07.640 に答える
4

私の場合、フォントのファイル名に基づいていました。何らかの理由で、FontName..ttf という名前でした。

二重ドットがあった理由はわかりません。元のフォントを調べたところ、windows\fonts フォルダーに FontName..ttf としてありました。Windows は気にしなかったようですが、Android はびっくりしました。ファイルの名前を変更しましたが、今はすべて満足しています。

于 2013-01-29T13:36:04.810 に答える
2

小文字で行う:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/charissilr.ttf");

ファイルの名前も変更することを忘れないでください。

于 2013-12-05T06:42:25.573 に答える
0

Androidスタジオで:私にとってうまくいったのは、フォントのサブフォルダーなしでttfファイルをアセットフォルダーに直接配置することです。 src/main/assets/fonts に ttf がありました)。これは動作します: src/main/assets/oldengl.ttf Typeface customfont=Typeface.createFromAsset(getAssets(),"oldengl.ttf");

于 2015-08-27T00:27:29.740 に答える
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;
}
于 2014-10-06T17:47:27.723 に答える
0

私の場合、

私はちょうど前のコードを使用します..だから私は資産フォルダにフォントファイルを忘れて..

でも2時間じゃわからない…

このエラーの考えられるケース、

  1. フォントファイルがありません
  2. 間違ったフォント名または間違ったフォント拡張子

例: fonts/roboto.otfの代わりにfonts/roboto.ttf

于 2016-10-31T09:31:07.067 に答える
0

qwerjk で MagicTextView を使用していたときに、この問題に遭遇しました。MTV クラスをライブラリに入れて、メイン プロジェクトで使用しようとしました。これが私がそれを機能させる方法です:

  1. メイン プロジェクトのアセット フォルダーに、fonts というサブフォルダーを作成します。
  2. ttf ファイルを assets/fonts フォルダーにコピーします。私のファイル名はキャメルケース (ReservoirGrunge.ttf など) だったので、大文字の有無は関係ないようです。
  3. 私の主なプロジェクトでは、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" />
    
于 2014-05-11T05:46:16.580 に答える