Установить шрифт для всех текстовых представлений в действии?

Можно ли установить шрифт для всех TextViews в деятельности? Я могу установить шрифт для одного textView с помощью:

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

Но я хотел бы изменить все textViews сразу, вместо того, чтобы устанавливать это вручную для каждого textView, любая информация будет оценена!

Ответы на вопрос(7)

полужирный, курсив и т. Д., Переключая стиль вашего 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);
        }
    }

}

Вы можете создать папку «Активы» следующим образом: Create Assets

И ваша папка Assets должна выглядеть так:

enter image description here

Наконец, ваш TextView в xml должен быть представлением типа TextViewAsap. Теперь он может использовать любой стиль, который вы закодировали ...

<com.example.project.TextViewAsap
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Example Text"
                android:textStyle="bold"/>
example of more "generic" way with use of reflection:

** он представляет идею привлечения метода дочерних групп представления 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..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:

с помощью отражения следует быть очень осторожным. Класс отражения это оченьexceptional& Quot;

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
Решение Вопроса

: Просто вызовите этот метод, передав родительское представление в качестве аргумента.

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

}
 08 сент. 2013 г., 05:37
@AgarwalShankar Спасибо! Это работает чудесно!
 26 мая 2012 г., 16:16
Да, конечно, я действительно согласен с вами. Спасибо за эти решения!
 27 сент. 2013 г., 01:13
Улучшение метода 1 заключается в том, чтобы создать шрифт один раз (Typeface.createFromAsset) и сохранить его как поле в классе, а не создавать его для каждого TextView.
 26 мая 2012 г., 15:56
@ChristopheCVB точно, но у меня есть два решения, и он решает, что он хочет сделать, и второе - лучшее решение
 26 мая 2012 г., 15:54
Оба решения работают, на самом деле. Но первый действительно тяжелый и каждый раз, когда вы добавляете TextView в макет, вы должны вспомнить метод ... Второй - лучший, но он подразумевает полный рефакторинг проекта (обратите внимание, что если проект не велик, это может занять несколько минут ...

я создал статический класс, который можно использовать для установки гарнитуры всего представления (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. Я создаю мой в OnCreate (), используя файл .ttf, расположенный в моей папке Resources / Assets /. Убедитесь, что файл помечен как актив Android в его & apos; свойства.

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);
}
 17 янв. 2014 г., 17:04
Работает как шарм для меня в Xamarin, СПАСИБО!
 27 июл. 2018 г., 19:40
Это работает для представлений, которые еще не были созданы?
 18 июн. 2014 г., 22:27
постскриптум EditText и Button расширяют TextView, поэтому вам не нужно явно их проверять

Best answers

1. Setting custom font for one textView

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

2. Setting custom font for all 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" />

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

Calligraphy библиотека, которая доступна здесь:
Библиотека каллиграфии Android

Ваш ответ на вопрос