studio para how fuentes font family descargar custom android custom-controls android-textview typeface

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" />