Establecer fuente personalizada en todas las TextViews

¿Hay una manera fácil de hacer todas las vistas de texto (y cualquier otro elemento de texto en mi aplicación) para usar una fuente personalizada de mi propio (y no las opciones integradas), sin tener que configurarlas manualmente a través de textview.setTypeface ()?

Creo que ampliar Textview haría el truco, pero luego la construcción de interfaces con el editor visual es una especie de dolor. Yo estaba pensando en algo como el estilo, pero no puede encontrar cómo establecer una fuente personalizada allí.

Si necesita establecer una fuente para todas las TextViews en la aplicación Android, puede utilizar esta solución. Anulará los tipos de texto de ALL TextView, incluirá la barra de acción y otros componentes estándar, pero la fuente de la contraseña de EditText no será invalidada.

MyApp.java

public class MyApp extends Application { @Override public void onCreate() { TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf"); } } 

TypefaceUtil.java

  public class TypefaceUtil { /** * Using reflection to override default typeface * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN * @param context to work with assets * @param defaultFontNameToOverride for example "monospace" * @param customFontFileNameInAssets file name of the font from assets */ public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) { try { final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets); final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride); defaultFontTypefaceField.setAccessible(true); defaultFontTypefaceField.set(null, customFontTypeface); } catch (Exception e) { Log.e("TypefaceUtil","Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride); } } 

}

Themes.xml

  <?xml version="1.0" encoding="utf-8"?> <resources> <style name="MyAppTheme" parent="@android:style/Theme.Holo.Light"> <!-- you should set typeface which you want to override with TypefaceUtil --> <item name="android:typeface">serif</item> </style> </resources> 

Actualización para Android 5.0 o superior

Como he investigado y probado en el dispositivo que ejecuta api 5.0 o superior esta solución está funcionando bien, porque estoy usando el único archivo style.xml y no hacer otro style.xml en la carpeta values-21

Aunque algunos usuarios me preguntan que esta solución no funciona con el dispositivo android 5.0 (pueden estar utilizando valores-21 style.xml, supongo)

Por lo tanto, debido a que en la API 21, la mayoría de los estilos de texto incluyen la configuración fontFamily, como

 <item name="fontFamily">@string/font_family_body_1_material</item> 

Que aplica la fuente predeterminada de Roboto Regular:

 <string name="font_family_body_1_material">sans-serif</string> 

Así que la mejor solución es

Si alguien que tiene problema no trabaja para 5.0+. No reemplace el tipo de letra en sus estilos de valores-v21.

Simplemente anule la fuente en los valores / style.xml y será bueno para ir 🙂

Puede crear un método para establecer tipo de letra para una vista de texto en una clase común y puede establecer la llamada a ese método y enviarla como su atributo.

Sí. Sólo tienes que hacer un estilo y establecerlo en una fuente determinada y, a continuación, establecer toda la aplicación en ese estilo.

Puede hacerlo creando una subclase de TextView y llamando al método setTypeFace dentro de ella. Por ejemplo en constructor.

Hacer un método en la clase Constantes para que se pueda acceder desde todos los fragmentos y actividades:

  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(Typeface.createFromAsset(context.getAssets(), "font/Lato-Regular.ttf")); } else if (v instanceof EditText) { ((EditText) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "font/Lato-Regular.ttf")); } else if (v instanceof Button) { ((Button) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "font/Lato-Regular.ttf")); } } catch (Exception e) { } } 

Método de llamada en actividad como:

  Constants.overrideFonts(MainActivity.this, getWindow().getDecorView().getRootView()); 

Método de llamada en Fragmento como:

  Constants.overrideFonts(getActivity(), view); 
  • Excepción de puntero nulo al importar una fuente en android
  • Android: añadir helvetica neue fuente en la aplicación
  • Establecer una fuente específica en un styles.xml
  • Android: Cómo agregar fuentes personalizadas a theme / style / xml
  • Mi aplicación se desplaza muy mal después de importar la fuente roboto en la carpeta assets / fonts
  • Cómo obtener el tamaño de texto predeterminado en píxeles en Android
  • Problema al usar una fuente personalizada - "no se puede hacer el tipo de letra nativo"
  • Cómo incrustar una fuente personalizada en la aplicación de Android (WebView)
  • Cómo utilizar la fuente tamil en android
  • Cómo configurar Gujarati palabra conjunta en Android?
  • Cómo instalar la fuente múltiple en el dispositivo android manualmente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.