Fuentes personalizadas y vista de texto personalizada en Android
De una aplicación que necesito desarrollar, he recibido una fuente específica que tiene muchos archivos como FontName-Regular, FontName-Bold, FontName-it. Necesito usarlo en todas las vistas de texto en la aplicación. Primero pensé que era una tarea fácil. Mire SO y encontré un hilo muy bonito:aqu
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 llamé a este método durante onCreate en mi actividad. Cada textView en mi aplicación mostraba esa fuente y ese chico, estaba feliz de alejarme tan fácilmente. Hasta que llegué a una pantalla donde algunas vistas de texto requeríanNegrit comoStyle
(android:textStyle="bold"
). Entonces me di cuenta de que esta solución no me brinda la posibilidad de cargar elNegrit .ttf de los activos.
Than miró más allá y vio una buena implementación personalizada de TextView, en la misma pregunta SO:
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 eninit()
si mi control tiene Style configurado en negrita o no, ¿puedo asignar el TypeFace solicitado?
Gracias por tu tiempo
LE. Siguiendo el ejemplo a continuación, actualicé 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*/);
}
}
}
Bueno Si depuro, la aplicación entra 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 de Android predeterminada. Me pregunto porque
He resumido todo en una publicación de blog aquí en mi blog tal vez ayude a alguien.