web-dev-qa-db-ja.com

Androidのカスタムフォントとカスタムテキストビュー

開発する必要のあるアプリケーションから、FontName-Regular、FontName-BoldFontName-it。アプリケーションのすべてのテキストビューで使用する必要があります。最初は簡単な作業だと思いました。 SOを見て、とても素敵なスレッドを見つけました: ここ

だから最初に私は好きでした:

_public static void overrideFonts(final Context context, final View v) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideFonts(context, child);
            }
        } else if (v instanceof TextView) {
            ((TextView)v).setTypeface(FONT_REGULAR);
        }
    } catch (Exception e) {
        e.printStackTrace();
        // ignore
    }
}
_

そして、私のアクティビティのonCreate中にこのメソッドを呼び出しました。私のアプリのすべてのtextViewは、そのフォントと男の子を表示していました。とても簡単に逃げることができてうれしかったです。いくつかのテキストビューが必要な画面に到達するまで太字as Style(_Android:textStyle="bold"_)。次に、このソリューションでは、アセットからFont-Bold。ttfをロードする可能性がないことに気付きました。

さらに調べて、同じSO質問:

_public class MyTextView extends TextView {

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyTextView(Context context) {
        super(context);
        init();
    }

    public void init() {

        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf");
        setTypeface(tf ,1);

    }
    }
_

これはさらに良く見えます。私の質問は、コントロールのスタイルが太字に設定されているかどうかをinit()で検出して、要求された書体を割り当てるにはどうすればよいですか?

お時間をいただきありがとうございます。

LE。以下の例に従って、クラスを次のように更新しました。

_public class MyTextView extends TextView {

    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR);
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(),  Constants.FONT_BOLD);

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

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

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

    public void setTypeface(Typeface tf, int style) {
        if (style == Typeface.BOLD) {
            super.setTypeface(boldTypeface/*, -1*/);
        } else {
            super.setTypeface(normalTypeface/*, -1*/);
        }
    }
}
_

デバッグすると、アプリはsetTypeFaceになり、太字のものが適用されているように見えますが、私のレイアウトでは、太字ではなく、変更が表示されません。使用するフォントに関係なく、TextViewは変更されず、デフォルトのAndroidフォントで表示されます。なぜだろうか?

私はブログ投稿にすべてを要約しました ここに私のブログにあります 多分それは誰かを助けるでしょう。

18
Alin

TextViewのコンストラクターは、XML属性_Android:textStyle_から取得したstyleパラメーターを使用してsetTypeface(Typeface tf, int style)を呼び出します。したがって、この呼び出しをインターセプトして独自の書体を強制する場合は、次のようにこのメソッドをオーバーライドできます。

_public void setTypeface(Typeface tf, int style) {
    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf");
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf");

    if (style == Typeface.BOLD) {
        super.setTypeface(boldTypeface/*, -1*/);
    } else {
        super.setTypeface(normalTypeface/*, -1*/);
    }
}
_
26

私のCustomTextViewを使用すると、assetsフォルダー内のフォントファイル名を指定できます。

https://github.com/mafshin/CustomTextView

使い方はとても簡単です。

<com.my.app.CustomTextView
        xmlns:custom="http://schemas.Android.com/apk/res/com.my.app"            
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Test text"
        Android:id="@+id/testcustomview" 

        custom:fontAssetName="Politica XT.otf"
        />
9
Mohsen Afshin

カスタムフォント用の独自のパッケージを作成してプロジェクトにインポートし、後で使用できるようにする方がよいと思います。

  package com.codeslips.utilities;  

  import Android.content.Context; 
  import Android.graphics.Typeface;
  import Android.util.AttributeSet;
  import Android.widget.TextView;  

  public class CustomTextView extends TextView {  

          public CustomTextView(Context context)
               { super(context); setFont(); }  

          public CustomTextView(Context context,AttributeSet set)
             { super(context,set); setFont(); } 

          public CustomTextView(Context context,AttributeSet set,int defaultStyle) 
             { super(context,set,defaultStyle); setFont(); } 

          private void setFont() { 

           Typeface typeface=Typeface.createFromAsset(getContext().getAssets(),"fonts/your-font.ttf"); 
           setTypeface(typeface); //function used to set font

             }  
          }

次に、XMLファイルで上記のクラスを使用して、カスタムフォントを作成します

    <com.codeslips.utilities.CustomTextView   
       Android:layout_width="wrap_content" 
       Android:layout_height="match_parent"
       Android:text="Upload Image" 
       Android:paddingTop="10sp"
       Android:textSize="14sp"
       Android:layout_weight="0.7"
       Android:textColor="@Android:color/white"/>
2
Siva Chegondi