Установить шрифт для всех textViews в activity?
можно ли установить шрифт для всех TextViews в действии? Я могу установить шрифт для одного textView с помощью:
TextView tv=(TextView)findViewById(R.id.textView1);
Typeface face=Typeface.createFromAsset(getAssets(), "font.ttf");
tv.setTypeface(face);
но я хотел бы изменить все textViews сразу, вместо того, чтобы устанавливать его вручную для каждого textView, любая информация будет оценена!
7 ответов:
Solutions 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) { } }
Solutions 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); } } }
один из моей личной коллекции:
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); } }
Если вы ищете более общее программное решение, я создал статический класс, который можно использовать для установки шрифта всего представления (Activity UI). Обратите внимание, что я работаю с Mono (C#), но вы можете легко реализовать его с помощью Java.
вы можете передать этому классу макет или определенный вид, который вы хотите настроить. Если вы хотите быть суперэффективным, вы можете реализовать его с помощью Одноэлементного шаблона.
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"); } } }
в вашей деятельности вам придется создать объект шрифта. Я создаю свой в OnCreate () с помощью a .файл ttf помещен в каталог мои ресурсы/активы/. Убедитесь, что файл помечен как актив 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); }
расширение ответа Агарвала... вы можете установить обычный, полужирный, курсив и т. д. При переключении стиль вашего виджет 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); } } }
вы можете создать свою папку активов следующим образом:
и ваша папка активов должна выглядеть так:
наконец, ваш TextView в xml должен быть представлением типа TextViewAsap. Теперь он может использовать любой стиль, который вы закодированы...
<com.example.project.TextViewAsap android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Example Text" android:textStyle="bold"/>
лучшие ответы
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> ... />
=>
<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" />
пример более "общего" способа с использованием отражения:
** это представляет собой идею привлечения viewgroup детский метод 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.вид.RemotableViewMethod
можно использовать
Calligraphy
библиотека, которая доступна здесь:
Библиотека Каллиграфии Android