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í.
- Recurso de fuente en Android
- ¿Cómo puedo escribir persa en android?
- Gran tamaño de fuente inutilizable en Android Studio
- Cómo obtener el contexto en getView del adaptador para listview
- Indic-text-renderer usando harfbuzz y freetype
- Fuente múltiple No funciona a tiempo en la aplicación
- Cómo configurar la escala de la fuente en mi propia aplicación Android?
- ¿Puedo subrayar texto en un diseño de Android?
- ¿Cuál es la familia de fuentes predeterminada en Android?
- Cómo utilizar la fuente de Roboto en android Project
- Tipo de fuente no funciona
- La página Web Gujarati no se muestra perfecta en la vista Web
- Cómo cambiar la fuente predeterminada de la aplicación de Android?
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);