para - how to use toolbar android
Fuentes personalizadas y Textview personalizado en Android (3)
Creo que es mejor crear su propio paquete para fuentes personalizadas e importarlas en su proyecto para que pueda usarlas más adelante.
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 tu archivo XML para tener tu 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"/>
Desde una aplicación que necesito desarrollar, recibí 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. Mira sobre SO y encontré un hilo muy bonito: here
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 vista de texto en mi aplicación mostraba esa fuente y chico, estaba feliz por haberme alejado tan fácilmente. Hasta que llegué a una pantalla donde algunas vistas de texto requerían Bold as Style
( android:textStyle="bold"
). Luego me di cuenta de que esta solución no me ofrece la posibilidad de cargar el archivo .ttf de Font-Bold desde los activos.
Luego miró más allá y vio una buena implementación personalizada de TextView, en la misma pregunta de 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 en init()
si mi control tiene el estilo establecido en negrita o no para poder asignar el TypeFace solicitado?
Gracias por tu tiempo.
LE. Siguiendo el siguiente ejemplo, 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*/);
}
}
}
Bueno, si depuro, la aplicación entra en setTypeFace y parece que aplica el negrita, pero en mi diseño no puedo ver ningún cambio, no 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.
El constructor de TextView
llama a setTypeface(Typeface tf, int style)
con el parámetro de style
recuperado del atributo XML android:textStyle
. Por lo tanto, si desea interceptar esta llamada para forzar su propia tipografía, puede anular 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*/);
}
}
Puede usar mi CustomTextView
que le permite especificar un nombre de archivo de fuente en su carpeta de assets
:
https://github.com/mafshin/CustomTextView
y el uso es realmente 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"
/>