设置活动中所有textViews的字体?

时间:2012-05-26 13:36:33

标签: android fonts textview typeface

是否可以为活动中的所有TextView设置字体?我可以使用以下方法设置单个textView的字体:

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

但是我想一次更改所有textView,而不是为每个textView手动设置,任何信息都将不胜感激!

8 个答案:

答案 0 :(得分:90)

Solution1 ::只需通过将父视图作为参数传递来调用这些方法。

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) {
 }
 }

Solution2 ::您可以使用自定义字体继承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);
        }
    }

}

答案 1 :(得分:8)

我个人收藏中的那篇:

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

答案 2 :(得分:3)

如果您正在寻找更通用的编程解决方案,我创建了一个静态类,可用于设置整个视图的字体(Activity UI)。请注意,我正在使用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);
}

答案 3 :(得分:1)

扩展Agarwal的答案......您可以通过切换TextView的样式来设置常规,粗体,斜体等。

navigator.camera.getPicture(onPhotoDataSuccess, onFail, { 
    quality: 50, 
    cameraDirection:1, 
    destinationType: destinationType.DATA_URL}); 
}

您可以像这样创建Assets文件夹: Create Assets

您的Assets文件夹应如下所示:

enter image description here

最后,xml中的T​​extView应该是TextViewAsap类型的视图。现在它可以使用您编码的任何样式......

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

public class TextViewAsap extends TextView {

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

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

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

    private void init() {
        if (!isInEditMode()) {
            Typeface tf = Typeface.DEFAULT;

            switch (getTypeface().getStyle()) {
                case Typeface.BOLD:
                    tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Bold.ttf");
                    break;

                case Typeface.ITALIC:
                    tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Italic.ttf");
                    break;

                case Typeface.BOLD_ITALIC:
                    tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Italic.ttf");
                    break;

                default:
                    tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Regular.ttf");
                    break;
            }

            setTypeface(tf);
        }
    }

}

答案 4 :(得分:1)

最佳答案

<强> 1。为一个textView设置自定义字体

Typeface typeface = Typeface.createFromAsset(getContext().getAssets(), "Fonts/FontName.ttf");
textView.setTypeface (typeface);

<强> 2。为所有textViews设置自定义字体

创建如下所示的JavaClass

public class CustomFont extends android.support.v7.widget.AppCompatTextView {

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

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

    public CustomFont(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
            Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/FontName.ttf");
            setTypeface(tf);
    }
}

在你的xml页面

<packageName.javaClassName>

...

/>

=&GT;

    <com.mahdi.hossaini.app1.CustomFont
    android:id="@+id/TextView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:text="KEEP IT SIMPLE"
    android:textAlignment="center" />

答案 5 :(得分:0)

更多&#34;泛型&#34;的例子使用反射的方式:

**它提出了一个涉及viewgroup children的方法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();
    }
}

<强>注意:

使用反射应该非常小心。反思课非常&#34; 特殊&#34;

    例如,
  • 您应该检查是否存在注释以防止出现各种问题。在方法SetTextSize()的情况下,需要检查注释 android.view.RemotableViewMethod

答案 6 :(得分:0)

您可以使用Calligraphy库,该库在这里可用:
Android Calligraphy Library

答案 7 :(得分:0)

您可以使用样式继承。

让活动中的每个TextView都通过module.exports = { build: { extend(config, { isDev , isClient }) { if (isClient && !isDev) { config.optimization.splitChunks.maxSize = 250000 } } } } 声明样式,而不是通过手动android:textAppearence声明样式。

然后,让每个人的样式都继承活动样式,如下所示:

android:typeface

在style.xml中:

<TextView ...
      android:textAppearance="@style/item_name"/>
<TextView ...
      android:textAppearance="@style/item_details"/>