一部の要素のフォントの書体を変更するアプリがあります。ほとんどの人にとってはうまく機能しますが、フォントを変更しようとすると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);
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);
}
}
}
ここで見つかったいくつかの解決策に従ったが、成功しなかった。プログラマーがよく行うように、それは本当にあいまいなものだと思いました。それから私が読んだどこかで、フォントパスに関連している可能性があります:
の代わりに:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"blanch_caps.ttf");
変更後:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/blanch_caps.ttf");
そして、私のファイルはassets/fonts/blanch_caps.ttfにあります。それは魅力のように機能しません!
このエラーは、フォントがライブラリアセットフォルダーにあるときに発生しました。このライブラリを使用していたアプリケーションのアセットにコピーすると、エラーが消えました。
アセットをインポートできないようです: Android Libraryアセットフォルダーはコピーされません
そして、ここに他のいくつかのケースがあります: カスタムフォントを使用するときの問題-"ネイティブな書体は作成できません"
私はこれに多く苦労していました。私はあらゆる可能性を試しましたが、何も役に立ちません。結局、問題はどこか別のところにありました。 Gradleを使用してプロジェクトをビルドする場合は、build.gradleファイルにこれらの行を追加することを忘れないでください。これで私の問題は解決しました。
sourceSets {
main {
assets.srcDirs = ['assets']
}
}
Android Studioのsrc-> main内にアセットフォルダーを作成する必要があります。この方法でうまくいきました!
私の場合、assetsフォルダーは/main/Java/assets
にありますが、/main/assets
になければなりません。
私の場合、それはフォントのファイル名に基づいていました。何らかの理由でFontName..ttfという名前が付けられました
二重ドットが存在する理由がわかりません-元のフォントを検索し、それがFontName..ttfとしてwindows\fontsフォルダーにありました。どうやらWindowsは気にしませんでしたが、Androidがおかしくなりました。ファイルの名前を変更しました。
小文字で行う:
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/charissilr.ttf");
ファイルの名前も忘れずに変更してください。
これを変える
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"fonts/CharisSILR.ttf");
に
Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
"CharisSILR.ttf");
私たちの状況では、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;
}
私の場合、アセットフォルダー(手動で作成したもの)を削除し、ウィザードを使用して新しいフォルダーを作成しました。どうやら、アセットフォルダーとしてではなく、通常のフォルダーとして読み取られたため、getAssets()が機能せず、エラーが発生しました。
私の場合、
以前のコードを使用するだけです。したがって、assetsフォルダのフォントファイルを忘れます。
しかし、私は2時間把握することはできません。
このエラーの考えられるケース、
- フォントファイルがありません
- 間違ったフォント名または間違ったフォント拡張子
例:fonts/roboto.otfの代わりにfonts/roboto.ttf
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スタイルに変換すると、私が推測する問題を解決できます。
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 ");
QwerjkのMagicTextViewを使用していたときに、この問題に遭遇しました。 MTVクラスをライブラリに配置して、メインプロジェクトで使用しようとしました。これがどのように動作するようになったかです:
私のメインプロジェクトでは、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" />