2016-11-14 22 views
1

私はカスタムフォントを拡張しましたTextView私は自分のアプリケーション内でカスタムフォントを使用していますが、何らかの理由で私はプログラムの実行時例外問題のフォントを見つけられません。ランタイム例外:試したフォントごとにフォントが見つかりません - Android

私が使用しているディレクトリの形式はmain > assets > fonts > Portrait-Light.ttf

screenshot of directory

である私は解決策のためにどこでも見てきたが、それらはすべて、SOで同じ答えを丸めているように見えます。

CustomFontTextView.java:

public class CustomFontTextView extends TextView { 

    public CustomFontTextView(Context context) { 
     super(context); 
     applyCustomFont(context); 
    } 

    public CustomFontTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     applyCustomFont(context); 
    } 

    public CustomFontTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     applyCustomFont(context); 
    } 

    private void applyCustomFont(Context context) { 
     Log.e("it gets here", "custom font"); 
     Typeface customFont = FontCache.getTypeface("Roboto-Italic.ttf", context); 
     setTypeface(customFont); 
    } 
} 

FontCache.java

class FontCache { 

    private static HashMap<String, Typeface> fontCache = new HashMap<>(); 

    static Typeface getTypeface(String fontname, Context context) { 
     Typeface typeface = fontCache.get(fontname); 
     if (typeface == null) { 
      try { 
       typeface = Typeface.createFromAsset(context.getAssets(), "fonts/" + fontname); 
      } catch (Exception e) { 
       Log.e("failed", e.getMessage()); 
      } 
      fontCache.put(fontname, typeface); 
     } 
     return typeface; 
    } 
} 

XML:私は肝炎

<icn.premierandroid.misc.CustomFontTextView 
      android:id="@+id/switch_description" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:textSize="14sp" 
      android:textColor="@color/colorPrimary" 
      android:gravity="center_horizontal" 
      android:text="@string/are_you_over_18_years_old"/> 

eは.otfなどの異なるフォーマットで、Roboto-Italic.ttfなどの異なるフォントと、Sunset-Clouds.ttfというdafont.comの別のランダムなフォントで試しましたが、まだエラーメッセージが表示されます。何が起こっていますか?これはうまくいくはずです。私はGradle、Grade-Wrapperディストリビューション、Android gradleプラグインなどのプラグインをすべて更新しました。

は、私もそれを行うための一つの方法を試してみました:

AssetManager am = context. getApplicationContext(). getAssets(); 
    Typeface font = Typeface.createFromAsset(
    am, String.format(Locale.US, "fonts/%s", "portrait-light.ttf")); 

私は何かが足りないのですか?

更新:

キャッチを削除すると、このスタックトレースが表示されます。

プロセス:icn.premierandroid、PID:3829 java.lang.RuntimeException:活性ComponentInfoを開始できません{icn.premierandroid/icn.premierandroid.RegisterActivity} android.view.InflateException:バイナリXMLファイル行#100:エラー 膨張クラスicn.premierandroid.misc.CustomFontTextView android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767) でandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702) で ... ..

原因:android.view.InflateException:B inary XMLファイルライン#100: andic.view.LayoutInflater.createViewFromTag(LayoutInflater.java:750)の に、icn.premierandroid.misc.CustomFontTextView をinflatingする際にエラーがandroid.view.LayoutInflater.createViewで発生しました。 java.lang.reflect.Constructor.newInstanceでにjava.lang.reflect.InvocationTargetException :android.view.LayoutInflater.rInflate(LayoutInflater.java:813)

.....によって引き起こさ

で (ネイティブメソッド) at java.lang.reflect.Constructor.newInstance(コンストラクタ。Javaの:288 android.view.LayoutInflater.createViewで) (LayoutInflater.java:614)

....によって引き起こさ

:java.lang.RuntimeException:フォントの資産は フォント/ GleegooRegularが見つかりません。 icn.premierandroid.misc.CustomFontTextView.applyCustomFontでicn.premierandroid.misc.FontCache.getTypeface(FontCache.java:21) (CustomFontTextView.javaでandroid.graphics.Typeface.createFromAsset(Typeface.java:272) におけるTTF :28) at icn.premierandroid.misc.CustomFontTextView(CustomFontTextView.java:18) at java.lang.reflect.Constructor .newInstance(ネイティブメソッド)

.....

UPDATE 2:

わかりましたので、奇妙な回避策はこのためにあります。あなたがassetsフォルダをのmainフォルダにまっすぐに追加すると、アンドロイドスタジオはそれを気に入らないようです。最初にapp/src/main/resフォルダに追加してからmainフォルダに移動する必要があります。なぜそれがこのようなものなのかという手掛かりはありませんが、それは私の問題を解決しました。

+0

など、

Typeface Roboto = Typeface.createFromAsset(getAssets(), "fonts/Roboto-Italic.ttf"); 

とのTextViewにフォントセット、のonCreateメソッド内

put .ttf fonts in app > assets > fonts > Roboto-Italic.ttf 

そして....これを試してみてくださいエラースタックトレース –

+0

を投稿してください@最大、あなたのためにそれを追加、芽。 – BIW

+0

"フォントアセットが見つかりませんフォント/ GleegooRegular.ttf"、私は確信していますが、あなたのフォントディレクトリにこのフォントが表示されません。 – harshitpthk

答えて

1

実際の問題は、あなたの資産を設定していないということですder。あなたが持っていた場合は、プロジェクトビューで次のようになります。Asset folder with pictogram

やAndroidビューでこのよう

は:

Asset folder with pictogram, Android view

だから、あなたは、単にStudioの資産フォルダとしてこのフォルダを追加する必要があります: プロジェクト構造ウィンドウをクリックするか(またはAlt + 1を押して)、Alt + Insertを押してフォルダ/アセットフォルダを選択します。その後、あなたのフォントを置く。

OPからのアップデート:

わかりましたので、奇妙な回避策はこのためにあります。 app/src/main内のメインフォルダにアセットフォルダを直接追加すると、アンドロイドスタジオはそれを気に入らないようです。最初にapp/src/main/resフォルダに追加してから、メインフォルダに移動する必要があります。なぜそれがこのようなものなのかという手掛かりはありませんが、それは私の問題を解決しました。

+0

私はそれをこのように追加しました、私はそれを削除して、再度追加します。私はあなたに結果を知らせます。 – BIW

1

私たちのニーズに合わせてこのクラスを作成しました。

public class TextViewFonted extends TextView { 
    private static final String TAG = "TextViewFonted"; 

    public TextViewFonted(Context context) { 
     super(context); 
    } 

    public TextViewFonted(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setCustomFont(context, attrs); 
    } 

    public TextViewFonted(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setCustomFont(context, attrs); 
    } 

    private void setCustomFont(Context ctx, AttributeSet attrs) { 
     TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewFonted); 
     String customFont = a.getString(R.styleable.TextViewFonted_customFont); 
     if (customFont == null) customFont = "Roboto-Regular.ttf"; 
     setCustomFont(ctx, customFont); 
     a.recycle(); 
    } 

    public boolean setCustomFont(Context ctx, String asset) { 
     Typeface tf = null; 
     try { 
      tf = Typeface.createFromAsset(ctx.getAssets(), asset); 
     } catch (Exception e) { 
      Log.e(TAG, "Could not get typeface", e); 
      return false; 
     } 

     setTypeface(tf); 
     setLineSpacing(getTextSize() * 0.3f, 0.75f); 
     return true; 
    } 
} 

そして、このカスタム属性を使用することができるようにする、あなたのattrsにに追加する必要があります。

app:customFont="Roboto-Medium.ttf" 

あなたはそれが役に立つことを願っ:それはこのように、属性を使用して、当社のカスタムフォントを設定することができます.xmlの
次のブロック(そう R.styleable.TextViewFonted_customFontは動作します):

<declare-styleable name="TextViewFonted"> 
     <attr name="customFont" format="string"/> 
</declare-styleable> 

を私たちのケースでは、例えば、我々が使用する、setCustomFont()

はこのフォントを追加するには

アップデートを資産フォルダのルートにフォントを入れていますが、この方法では、この動作を変更することができ

Screenshot of fonts that are in assets folder

app:customFont="Comfortaa-Bold.ttf" 
+0

私はこれを試してみて、お答えいただきありがとうございます。 – BIW

+0

残念ながら、フォントディレクトリ内とassetsディレクトリ内に、まだ "java.lang.RuntimeException:Font asset not found"が表示されています。 – BIW

+0

更新された答えを見て、私はアセット付きのスクリーンショットを追加しました。フォント名を誤って入力していないことは確かですか? – Gaket

0

textview.setTypeface(Roboto); 
+0

病気を試してみて、あなたに知らせてください。 – BIW

関連する問題