2012-01-21 17 views
17

desde una aplicación que necesito para desarrollar, he recibido una fuente específica que tiene muchos archivos como FontName-Regular, FontName-Bold, FontName-it. Necesito usarlo en todas las textviews de la aplicación. Primero pensé que era una tarea fácil. Mirar por encima de SO y ha encontrado un muy buen hilo: hereFuentes personalizadas y Textview personalizada en Android

Así que primero me gustó:

public static 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(FONT_REGULAR); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     // ignore 
    } 
} 

Y llama a este método durante onCreate en mi actividad. Cada textView en mi aplicación mostraba esa fuente y chico, estaba feliz de alejarme tan fácil. Hasta que llegué a una pantalla donde algunas textviews requerían Bold como Style (android:textStyle="bold"). Entonces me di cuenta de que esta solución no me da la posibilidad de cargar el Font-Bold .ttf de los activos.

Que se veía más lejos y vio una buena aplicación de Vista de Texto de encargo, en el mismo SO pregunta:

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

    public void init() { 

     Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf"); 
     setTypeface(tf ,1); 

    } 
    } 

Esto se ve aún mejor. Mi pregunta es: ¿cómo puedo detectar en init() si mi control tiene el Estilo configurado en negrita o no, así que puedo asignar el TypeFace solicitado?

Gracias por su tiempo.

LE. Siguiendo el ejemplo de abajo, he actualizado mi clase como:

public class MyTextView extends TextView { 

    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_BOLD); 

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

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

    public MyTextView(Context context) { 
     super(context); 
    } 

    public void setTypeface(Typeface tf, int style) { 
     if (style == Typeface.BOLD) { 
      super.setTypeface(boldTypeface/*, -1*/); 
     } else { 
      super.setTypeface(normalTypeface/*, -1*/); 
     } 
    } 
} 

Bien Si elimino errores, la aplicación va en setTypeFace y parece aplicar la negrita, pero en mi diseño no puedo ver ningún cambio , no en negrita. No importa qué fuente use, no se realizan cambios en mi TextView y se muestra con la fuente android predeterminada. Me pregunto porque ?

He resumido todo en una publicación de blog here on my blog tal vez ayude a alguien.

+0

Gracias para la pregunta detallada y la elaboración, y la gran publicación de blog!Funcionó perfectamente para mí También subclassed Button para el mismo resultado. Mi única consulta es w.r.t. la eficiencia de llamar a createFromAsset() _every_ time. ¿Sería mejor cargar las fuentes una vez y almacenarlas en su clase de Aplicación, y acceder a ellas desde MyTextView.setTypeface()? –

+0

Gracias por sus palabras. Pensé en eso también pero no probé para ver cómo funcionaba. Debería funcionar bien. De todos modos, no he visto ninguna penalización de rendimiento con muchas vistas en una pantalla. – Alin

Respuesta

24

El constructor de TextView llama a setTypeface(Typeface tf, int style) con el parámetro style obtenido del atributo XML android:textStyle. Por lo tanto, si se desea interceptar esta llamada para obligar a su propio tipo de letra se puede reemplazar este método de la siguiente manera:

public void setTypeface(Typeface tf, int style) { 
    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf"); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf"); 

    if (style == Typeface.BOLD) { 
     super.setTypeface(boldTypeface/*, -1*/); 
    } else { 
     super.setTypeface(normalTypeface/*, -1*/); 
    } 
} 
+0

Su solución parece correcta, pero no funciona ... – Alin

+2

@Alin: ¡El problema era que 'setTypeface()' era llamado por los constructores antes de que 'Typeface's se creara! Entonces, mueva la creación de 'Typeface's dentro de' setTypeface() 'y ¡ahora funcionará! –

+0

Ahora funciona, gracias. Me has hecho el día. – Alin

9

Usted puede usar mi CustomTextView que le permite especificar un nombre de archivo de fuentes en la carpeta de assets:

https://github.com/mafshin/CustomTextView

y el uso es muy simple:

<com.my.app.CustomTextView 
     xmlns:custom="http://schemas.android.com/apk/res/com.my.app"    
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Test text" 
     android:id="@+id/testcustomview" 

     custom:fontAssetName="Politica XT.otf" 
     /> 
2

creo que es mejor para conformar e su propio paquete de fuentes personalizadas e importarlos en su proyecto para que pueda utilizarlos más adelante en el futuro

package com.codeslips.utilities; 

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

    public class CustomTextView extends TextView { 

      public CustomTextView(Context context) 
       { super(context); setFont(); } 

      public CustomTextView(Context context,AttributeSet set) 
      { super(context,set); setFont(); } 

      public CustomTextView(Context context,AttributeSet set,int defaultStyle) 
      { super(context,set,defaultStyle); setFont(); } 

      private void setFont() { 

      Typeface typeface=Typeface.createFromAsset(getContext().getAssets(),"fonts/your-font.ttf"); 
      setTypeface(typeface); //function used to set font 

      } 
      } 

Ahora usa la clase anterior en el archivo XML para tener su fuente personalizada

<com.codeslips.utilities.CustomTextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:text="Upload Image" 
     android:paddingTop="10sp" 
     android:textSize="14sp" 
     android:layout_weight="0.7" 
     android:textColor="@android:color/white"/> 
Cuestiones relacionadas