Android 为活动中的所有文本视图设置字体?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10766716/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 04:52:46  来源:igfitidea点击:

Set font for all textViews in activity?

androidfontstextviewtypeface

提问by William L.

Is it possible to set the font for all the TextViews in a activity? I can set the font for a single textView by using:

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

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

But I would like to change all the textViews at once, instead of setting it manually for every textView, any info would be appreciated!

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

回答by Shankar Agarwal

Solution1:: Just call these method by passing parent view as argument.

解决方案 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) {
 }
 }

Solution2:: you can subclass the TextView class with your custom font and use it instead of textview.

解决方案 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);
        }
    }

}

回答by Red Hot Chili Coder

The one from my personal collection:

我个人收藏的一张:

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

回答by JCKortlang

If you are looking for a more general programatic solution, I created a static class that can be used to set the Typeface of an entire view (Activity UI). Note that I am working with Mono (C#) but you can implement it easily using Java.

如果您正在寻找更通用的编程解决方案,我创建了一个静态类,可用于设置整个视图(活动 UI)的字体。请注意,我正在使用 Mono (C#),但您可以使用 Java 轻松实现它。

You can pass this class a layout or a specific view that you want to customize. If you want to be super efficient you could implement it using the Singleton pattern.

您可以向此类传递要自定义的布局或特定视图。如果你想变得超级高效,你可以使用单例模式来实现它。

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

    }

In your activity you will need to create a Typeface object. I create mine in the OnCreate() using a .ttf file placed in my Resources/Assets/ directory. Make sure that the file is marked as an Android Asset in its' properties.

在您的活动中,您需要创建一个 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);
}

回答by dianakarenms

Extending Agarwal's answer... you can set regular, bold, italic, etc by switching the style of your TextView.

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

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

}

You can create your Assets folder like this: Create Assets

您可以像这样创建您的资产文件夹: 创建资产

And your Assets folder should look like this:

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

enter image description here

在此处输入图片说明

Finally your TextView in xml should be a view of type TextViewAsap. Now it can use any style you coded...

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

<com.example.project.TextViewAsap
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Example Text"
                android:textStyle="bold"/>

回答by Mahdi Hossaini

Best answers

最佳答案

1. Setting custom font for one textView

1.为一个textView设置自定义字体

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


2. Setting custom font for all textViews

2.为所有textViews设置自定义字体

Create a JavaClass like below

创建一个如下所示的 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);
    }
}

And in your xml page

在你的 xml 页面中

<packageName.javaClassName>

...

/>

=>

=>

    <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" />

回答by Dariush Salami

You can use the Calligraphylibrary which is available here:
Android Calligraphy Library

您可以使用Calligraphy此处提供的库:
Android Calligraphy Library

回答by f.khantsis

You can use style inheritance.

您可以使用样式继承。

Have every one of your TextViews in the activity declare a style via android:textAppearence, instead of manually android:typeface.

让活动中的每个 TextView 都通过android:textAppearence而非手动声明样式android:typeface

Then, have each one's style inherit the activity style, like so:

然后,让每个人的风格继承活动风格,像这样:

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

in style.xml:

在 style.xml 中:

<style name="ActivityStyle">
    <item name="android:fontFamily">@font/font</item>
</style>
<style name="item_name" parent="ActivityStyle">
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">20sp</item>
</style>
<style name="item_details" parent="ActivityStyle">
    <item name="android:textSize">15sp</item>
</style>

回答by ceph3us

example of more "generic" way with use of reflection:

使用反射的更“通用”方式的示例:

** it's presenting a idea of involving viewgroup children's method setTextSize(int,float) but you can adopt it as in the case of your question to setTypeFace()

** 它提出了一种涉及视图组儿童方法 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();
    }
}

CAUTION:

警告:

using reflection should be very careful. Reflection class it's very "exceptional"

使用反射应该非常小心。反射课非常“特殊

  • for example, you should check for the presence of annotations to prevent different kinds of problems. In the case of method SetTextSize () It is desirable to check the annotations android.view.RemotableViewMethod
  • 例如,您应该检查注释是否存在以防止出现不同类型的问题。在方法 SetTextSize() 的情况下,最好检查注释android.view.RemotableViewMethod