web-dev-qa-db-ja.com

「ネイティブの書体は作成できません」一部の人々のみ

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

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

Typeface.createFromAssetはアセットストリームをリークします

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

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

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);
        }
    }
}
68
HitOdessit

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

の代わりに:

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

変更後:

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

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

52
joao_dv

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

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

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

50
Lumis

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

    sourceSets {
    main {
        assets.srcDirs = ['assets']
    }
}
25
Michal

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

7
Madi

私の場合、assetsフォルダーは/main/Java/assetsにありますが、/main/assetsになければなりません。

4
Chulo

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

二重ドットが存在する理由がわかりません-元のフォントを検索し、それがFontName..ttfとしてwindows\fontsフォルダーにありました。どうやらWindowsは気にしませんでしたが、Androidがおかしくなりました。ファイルの名前を変更しました。

4
Tab

小文字で行う:

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

ファイルの名前も忘れずに変更してください。

2
Pedro HCDO

これを変える

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

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "CharisSILR.ttf");
1
Kadir altınok

私たちの状況では、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;
}
0
neoRiley

私の場合、アセットフォルダー(手動で作成したもの)を削除し、ウィザードを使用して新しいフォルダーを作成しました。どうやら、アセットフォルダーとしてではなく、通常のフォルダーとして読み取られたため、getAssets()が機能せず、エラーが発生しました。

0
omarwaleed

私の場合、

以前のコードを使用するだけです。したがって、assetsフォルダのフォントファイルを忘れます。

しかし、私は2時間把握することはできません。

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

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

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

0
Ranjith Kumar

EclipseスタイルのプロジェクトとAndroidスタジオスタイルのプロジェクトの両方をサポートすることを目的としたモジュールをインポートしたときに、この問題に遭遇しました。

ソースセットからアセットを削除することで問題を解決しました。

defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName '1.0'

        sourceSets {
            main {
                Java.srcDirs = ['src']
                res.srcDirs = ['res']
                //assets.srcDirs = ['assets']//commented this out because modlue was not having this directory
                manifest.srcFile 'AndroidManifest.xml'
            }
        }
    }

または、プロジェクトをAndroid studioスタイルに変換すると、私が推測する問題を解決できます。

0
Sanjeet A

in Android studio:私のために働いたのは、ttfファイルをfontsのサブフォルダなしでassetsフォルダにまっすぐ置くことで、サブフォルダ((getAssets()、 "fonts /oldengl.ttf ")は、src/main/assets/fontsにttfがあるときに機能しませんでした)。これは動作します:src/main/assets/oldengl.ttf Typeface customfont = Typeface.createFromAsset(getAssets()、" oldengl.ttf ");

0
Stas Krantsov

QwerjkのMagicTextViewを使用していたときに、この問題に遭遇しました。 MTVクラスをライブラリに配置して、メインプロジェクトで使用しようとしました。これがどのように動作するようになったかです:

  1. メインプロジェクトアセットフォルダーで、fontsというサブフォルダーを作成します
  2. Ttfファイルをasset/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" />
    
0
Chris Sprague