为活动中的所有textView设置字体?

有没有可能为活动中的所有TextView设置字体? 我可以通过使用以下设置单个文本视图的字体:

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

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

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 ::你可以使用你的自定义字体inheritanceTextView类,并使用它来代替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); } } } 

从我个人collections的一个:

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

如果您正在寻找更通用的编程解决scheme,我创build了一个静态类,可用于设置整个视图的字体(活动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"); } } } 

在你的活动中,你将需要创build一个Typeface对象。 我使用放在我的资源/资产/目录中的.ttf文件在OnCreate()中创build我的。 确保该文件的属性中标记为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); } 

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

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

你的资产文件夹应该如下所示:

在这里输入图像描述

最后,你在XML中的TextView应该是一个TextViewAsaptypes的视图。 现在它可以使用你编码的任何风格…

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

使用reflection的更“通用”方式的例子:

**它提出了涉及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(); } } 

警告:

使用reflection应该非常小心。 反思类是非常“ 特殊

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

最佳答案

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

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

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

像下面创build一个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" />