52

アクティビティ内のすべての TextView のフォントを設定することは可能ですか? 以下を使用して、単一の textView のフォントを設定できます。

    TextView tv=(TextView)findViewById(R.id.textView1); 
    Typeface face=Typeface.createFromAsset(getAssets(), "font.ttf"); 
    tv.setTypeface(face);

しかし、textView ごとに手動で設定するのではなく、すべての textViews を一度に変更したいと思います。情報をいただければ幸いです。

4

8 に答える 8

93

解決策 1:: 親ビューを引数として渡してこれらのメソッドを呼び出すだけです。

private 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(Typeface.createFromAsset(context.getAssets(), "font.ttf"));
        }
    } catch (Exception e) {
 }
 }

解決策 2:: TextView クラスをカスタム フォントでサブクラス化し、textview の代わりに使用できます。

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();
    }

    private void init() {
        if (!isInEditMode()) {
            Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font.ttf");
            setTypeface(tf);
        }
    }

}
于 2012-05-26T13:47:17.527 に答える
8

私の個人的なコレクションからの 1 つ:

private void setFontForContainer(ViewGroup contentLayout) {
    for (int i=0; i < contentLayout.getChildCount(); i++) {
        View view = contentLayout.getChildAt(i);
        if (view instanceof TextView)
            ((TextView)view).setTypeface(yourFont);
        else if (view instanceof ViewGroup)
            setFontForContainer((ViewGroup) view);
    }
}
于 2016-02-12T12:29:03.653 に答える
3

より一般的なプログラムによる解決策を探している場合は、ビュー全体 (Activity UI) の Typeface を設定するために使用できる静的クラスを作成しました。私は Mono (C#) を使用していますが、Java を使用して簡単に実装できることに注意してください。

このクラスに、カスタマイズしたいレイアウトまたは特定のビューを渡すことができます。非常に効率的になりたい場合は、Singleton パターンを使用して実装できます。

public static class AndroidTypefaceUtility 
{
    static AndroidTypefaceUtility()
    {
    }
    //Refer to the code block beneath this one, to see how to create a typeface.
    public static void SetTypefaceOfView(View view, Typeface customTypeface)
    {
    if (customTypeface != null && view != null)
    {
            try
            {
                if (view is TextView)
                    (view as TextView).Typeface = customTypeface;
                else if (view is Button)
                    (view as Button).Typeface = customTypeface;
                else if (view is EditText)
                    (view as EditText).Typeface = customTypeface;
                else if (view is ViewGroup)
                    SetTypefaceOfViewGroup((view as ViewGroup), customTypeface);
                else
                    Console.Error.WriteLine("AndroidTypefaceUtility: {0} is type of {1} and does not have a typeface property", view.Id, typeof(View));
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine("AndroidTypefaceUtility threw:\n{0}\n{1}", ex.GetType(), ex.StackTrace);
                    throw ex;
                }
            }
            else
            {
                Console.Error.WriteLine("AndroidTypefaceUtility: customTypeface / view parameter should not be null");
            }
        }

        public static void SetTypefaceOfViewGroup(ViewGroup layout, Typeface customTypeface)
        {
            if (customTypeface != null && layout != null)
            {
                for (int i = 0; i < layout.ChildCount; i++)
                {
                    SetTypefaceOfView(layout.GetChildAt(i), customTypeface);
                }
            }
            else
            {
                Console.Error.WriteLine("AndroidTypefaceUtility: customTypeface / layout parameter should not be null");
            }
        }

    }

アクティビティでは、Typeface オブジェクトを作成する必要があります。Resources/Assets/ ディレクトリにある .ttf ファイルを使用して OnCreate() で作成します。ファイルがそのプロパティで Android アセットとしてマークされていることを確認してください。

protected override void OnCreate(Bundle bundle)
{               
    ...
    LinearLayout rootLayout = (LinearLayout)FindViewById<LinearLayout>(Resource.Id.signInView_LinearLayout);
    Typeface allerTypeface = Typeface.CreateFromAsset(base.Assets,"Aller_Rg.ttf");
    AndroidTypefaceUtility.SetTypefaceOfViewGroup(rootLayout, allerTypeface);
}
于 2013-07-30T22:24:20.230 に答える
0

リフレクションを使用したより「一般的な」方法の例:

** ビューグループの子メソッド setTextSize(int,float) を使用するというアイデアを提示していますが、setTypeFace() への質問の場合と同様に採用できます

 /**
 * change text size of view group children for given class
 * @param v - view group ( for example Layout/widget)
 * @param clazz  - class to override ( for example EditText, TextView )
 * @param newSize - new font size
 */
public static void overrideTextSize(final View v, Class<?> clazz, float newSize) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideTextSize(child, clazz, newSize);
            }
        } else if (clazz.isAssignableFrom(v.getClass())) {
            /** create array for params */
            Class<?>[] paramTypes = new Class[2];
            /** set param array */
            paramTypes[0] = int.class;  // unit
            paramTypes[1] = float.class; // size
            /** get method for given name and parameters list */
            Method method = v.getClass().getMethod("setTextSize",paramTypes);
            /** create array for arguments */
            Object arglist[] = new Object[2];
            /** set arguments array */
            arglist[0] = TypedValue.COMPLEX_UNIT_SP;
            arglist[1] = newSize;
            /** invoke method with arguments */
            method.invoke(v,arglist);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

注意:

リフレクションの使用には細心の注意が必要です。リフレクションクラスは非常に「例外的」です

  • たとえば、さまざまな種類の問題を防ぐために、注釈の存在を確認する必要があります。メソッド SetTextSize() の場合android.view.RemotableViewMethodのアノテーションを確認することが望ましい
于 2015-07-05T21:10:23.767 に答える