Necesito usar cierta fuente para toda mi aplicación. Tengo un archivo .ttf para lo mismo. ¿Es posible establecer esto como fuente predeterminada, al inicio de la aplicación y luego usarla en otra parte de la aplicación? Cuando lo configuro, ¿cómo lo uso en mis XML de diseño?
java
android
android-fonts
Samuh
fuente
fuente
Respuestas:
Si con reflexion. Esto funciona ( basado en esta respuesta ):
(Nota: esta es una solución alternativa debido a la falta de soporte para las fuentes personalizadas, por lo que si desea cambiar esta situación, por favor, marque el tema de Android aquí ). Nota: No deje comentarios "yo también" sobre ese tema, todos los que lo han visto reciben un correo electrónico cuando lo hace. Así que solo "estrella" por favor.
Luego debe sobrecargar las pocas fuentes predeterminadas, por ejemplo en una clase de aplicación :
O, por supuesto, si está utilizando el mismo archivo de fuente, puede mejorarlo para cargarlo solo una vez.
Sin embargo, tiendo a anular uno, por ejemplo
"MONOSPACE"
, luego configurar un estilo para forzar la aplicación de tipo de letra en toda la extensión:API 21 Android 5.0
He investigado los informes en los comentarios de que no funciona y parece ser incompatible con el tema
android:Theme.Material.Light
.Si ese tema no es importante para usted, use un tema anterior, por ejemplo:
fuente
"DEFAULT_BOLD"
pero también un campo privado:private static Typeface[] sDefaults;
puede intentar acceder a esto reflexionando y configurandosDefaults[Typeface.ITALIC]
su Tipo de letra. Mira esto.TextView
todas partes para usar fuentes personalizadas o usar una solución basada en la reflexión como esta. Combinado con el conjunto limitante de fuentes disponibles en Android, hace que el desarrollo de aplicaciones atractivas sea mucho trabajo duro. He agregado una solicitud de función al rastreador de problemas de Android. Si desea ver esta función, puede marcarHay una gran biblioteca para fuentes personalizadas en Android: caligrafía
Aquí hay una muestra de cómo usarlo.
en Gradle necesita poner esta línea en el archivo build.gradle de su aplicación:
y luego crea una clase que se extienda
Application
y escribe este código:y en la clase de actividad ponga este método antes de onCreate:
y lo último que debería tener tu archivo de manifiesto es este:
¡y cambiará toda la actividad a tu fuente! ¡Es simple y limpio!
fuente
<b></b>
,<u></u>
y<i></i>
en elstrings.xml
archivo y hasta ahora funciona.Si bien esto no funcionaría para una aplicación completa, funcionaría para una Actividad y podría reutilizarse para cualquier otra Actividad. He actualizado mi código gracias a @ FR073N para admitir otras vistas. No estoy seguro de los problemas con
Buttons
,RadioGroups
etc., porque todas esas clases se extienden,TextView
por lo que deberían funcionar bien. Agregué un condicional booleano para usar la reflexión porque parece muy hack y podría comprometer notablemente el rendimiento.Nota: como se señaló, ¡esto no funcionará para contenido dinámico! Para eso, es posible llamar a este método con say an
onCreateView
ogetView
method, pero requiere un esfuerzo adicional.Luego, para usarlo, haría algo como esto:
Espero que ayude.
fuente
En resumen:
Opción # 1: Use la reflexión para aplicar la fuente (combinando la respuesta de weston y Roger Huang ):
Uso en la clase de aplicación:
configura un estilo para forzar la aplicación de tipo de letra de fuente (basada en lovefish ):
Pre-Lollipop:
Lollipop (API 21):
Opción 2: Subclase cada vista donde necesita personalizar la fuente, es decir. ListView, EditTextView, Button, etc. ( respuesta de Palani ):
Opción 3: Implemente un rastreador de vistas que atraviese la jerarquía de vistas de su pantalla actual:
Variación # 1 ( respuesta de Tom ):
Uso:
Variación # 2: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere .
Opción n. ° 4: utilice la Libra de terceros llamada Caligrafía .
Personalmente, recomendaría la Opción # 4, ya que ahorra muchos dolores de cabeza.
fuente
"sans-serif"
innewMap.put(
ymonospace
instyles
?! Quiero usar una fuente personalizada llamadabarana.ttf
.Me gustaría mejorar la respuesta de weston para API 21 Android 5.0.
Porque
Bajo API 21, la mayoría de los estilos de texto incluyen la configuración fontFamily, como:
Que aplica la fuente predeterminada Roboto Regular:
La respuesta original no aplica la fuente monoespacio, porque android: fontFamily tiene mayor prioridad que el atributo android: typeface ( referencia ). Usar Theme.Holo. * Es una solución válida, porque no hay configuración de android: fontFamily dentro.
Solución
Dado que Android 5.0 coloca el tipo de letra del sistema en la variable estática Typeface.sSystemFontMap ( referencia ), podemos usar la misma técnica de reflexión para reemplazarlo:
fuente
Button
títulos de barra de herramientas. Estoy anulando la fuente predeterminada en MainApplication de la siguiente manera:FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
. Estoy usando Nexus 5, v5.1.1Build.VERSION.SDK_INT == 21
- Eso es solo en laAPI 21
prueba en Nexus con API 22es muy simple ... 1.Descargue y coloque su fuente personalizada en activos ... luego escriba una clase separada para la vista de texto de la siguiente manera: aquí utilicé la fuente futura
}
y haga lo siguiente en xml:
fuente
También sugeriría extender TextView y otros controles, pero sería mejor considerar configurar la fuente en construcciones.
fuente
Me gustaría mejorar Weston 's y Roger Huang ' s respuestas de más de 21 API de Android piruleta con el tema ' Theme.AppCompat '.
Por debajo de Android 4.4
Sobre (igual) API 5.0
Y el archivo de utilidad FontsOverride es el mismo que el de la respuesta de weston . He probado en estos teléfonos:
Nexus 5 (sistema Android principal Android 5.1)
ZTE V5 (android 5.1 CM12.1)
Nota XIAOMI (Android 4.4 MIUI6)
HUAWEI C8850 (Android 2.3.5 DESCONOCIDO)
fuente
Puede encontrar una solución brillante aquí: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere .
Simplemente extienda las actividades de BaseActivity y escriba esos métodos. También debería mejorar las fuentes de caché como se describe aquí: https://stackoverflow.com/a/16902532/2914140 .
Después de algunas investigaciones, escribí un código que funciona en Samsung Galaxy Tab A (Android 5.0). Código utilizado de weston y Roger Huang, así como https://stackoverflow.com/a/33236102/2914140 . También probado en Lenovo TAB 2 A10-70L, donde no funciona. Inserté una fuente 'Comic Sans' aquí para ver la diferencia.
Para ejecutar el código en toda la aplicación, debe escribir en alguna clase como Aplicación lo siguiente:
Cree una carpeta 'fuentes' dentro de 'activos' y coloque las fuentes necesarias allí. Puede encontrar una instrucción simple aquí: https://stackoverflow.com/a/31697103/2914140 .
El dispositivo Lenovo también obtiene incorrectamente el valor de una tipografía. En la mayoría de los casos, devuelve Typeface.NORMAL, a veces nulo. Incluso si TextView está en negrita (en diseño de archivo xml). Ver aquí: TextView isBold siempre devuelve NORMAL . De esta manera, un texto en una pantalla siempre tiene una fuente regular, no negrita o cursiva. Así que creo que es un error de un productor.
fuente
Trabajando para Xamarin.Android:
Clase:
Implementación de aplicaciones:
Estilo:
fuente
A partir de Android O, ¡ahora es posible definirlo directamente desde el XML y ahora mi error está cerrado!
Ver aquí para más detalles
TL; DR:
Primero debes agregar tus fuentes al proyecto
En segundo lugar, agrega una familia de fuentes, así:
Finalmente, puede usar la fuente en un diseño o estilo:
¡Disfrutar!
fuente
Puede establecer fuentes personalizadas para cada diseño uno por uno, con solo una llamada de función de cada diseño pasando su Vista raíz. Primero, cree un enfoque singelton para acceder a objetos de fuente como este
Puede definir diferentes fuentes en la clase anterior. Ahora defina una clase de ayuda de fuente que aplicará las fuentes:
En el código anterior, solo estoy aplicando fuentes en textView y EditText, también puede aplicar fuentes en otros elementos de vista de manera similar. Solo necesita pasar la identificación de su grupo de Vista raíz al método de fuente de aplicación anterior. Por ejemplo, su diseño es:
En el diseño anterior, la identificación del padre raíz es "Padre principal" ahora permite aplicar la fuente
Salud :)
fuente
Sugeriría extender TextView y siempre usar su TextView personalizado dentro de sus diseños XML o donde sea que necesite un TextView. En su TextView personalizado, anule
setTypeface
fuente
La solución de Tom funciona muy bien, pero solo funciona con TextView y EditText.
Si desea cubrir la mayoría de las vistas (RadioGroup, TextView, Checkbox ...), creé un método que hace eso:
Este método recuperará el estilo de la vista establecida en XML (negrita, cursiva ...) y los aplicará si existen.
Para ListView, siempre creo un adaptador y configuro la fuente dentro de getView.
fuente
Escribí una clase asignando tipo de letra a las vistas en la jerarquía de vista actual y basé las propiedades del tipo de letra actual (negrita, normal, puede agregar otros estilos si lo desea):
Ahora en todos los fragmentos en onViewCreated o onCreateView, en todas las actividades en onCreate y en todos los adaptadores de vista en getView o newView solo invoque:
fuente
en la api 26 con build.gradle 3.0.0 y superior, puede crear un directorio de fuentes en res y usar esta línea en su estilo
para cambiar build.gradle, use esto en sus dependencias build.gradle
fuente
item
solo no establece la fuente para toda la aplicación. ¿Cualquier pista?Finalmente, Google se dio cuenta de la gravedad de este problema (aplicando una fuente personalizada a los componentes de la interfaz de usuario) e ideó una solución limpia para ello.
Primero, debe actualizar para admitir la biblioteca 26+ (es posible que también necesite actualizar su gradle {4.0+}, android studio), luego puede crear una nueva carpeta de recursos llamada font. En esta carpeta, puede poner sus recursos de fuente (.tff, ...). Luego, debe anular la aplicación predeterminada y forzar su fuente personalizada en ella :)
Nota: si desea admitir dispositivos con una API anterior a 16, ¡debe usar el espacio de nombres de la aplicación en lugar de Android!
fuente
También me gustaría mejorar la respuesta de weston para API 21 Android 5.0.
Tuve el mismo problema en mi Samsung s5, cuando utilicé la fuente DEFAULT. (con las otras fuentes funciona bien)
Logré hacerlo funcionar configurando el tipo de letra ("sans" por ejemplo) en archivos XML, para cada Vista de Texto o Botón
y en MyApplication Class:
Espero eso ayude.
fuente
Esta solución no funciona correctamente en algunas situaciones.
Entonces lo extiendo:
FontsReplacer.java
https://gist.github.com/orwir/6df839e3527647adc2d56bfadfaad805
fuente
La caligrafía funciona bastante bien, pero no es adecuada para mí, ya que no admite diferentes pesos (negrita, cursiva, etc.) para una familia de fuentes.
Así que probé Fontain , que le permite definir Vistas personalizadas y aplicarlas a las familias de fuentes personalizadas.
para usar Fontain, debe agregar lo siguiente a su módulo de aplicación build.gradle:
Luego, en lugar de usar TextView normal, debe usar FontTextView
Ejemplo de FontTextView con contenido en mayúsculas y negrita:
fuente
fuente
TextView
sPara cambiar la familia de fuentes predeterminada de TextViews, anule textViewStyle en el tema de su aplicación.
Para usar fuentes personalizadas en fontFamily, use recursos de fuentes que se encuentran en la biblioteca de soporte.
La función se agregó en Android 26, pero se incluyó en versiones anteriores a través de supportlib.
https://developer.android.com/guide/topics/resources/font-resource.html https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html # using-support-lib
fuente
Desde el lanzamiento de Android Oreo y su biblioteca de soporte (26.0.0) puede hacerlo fácilmente. Consulte esta respuesta en otra pregunta.
Básicamente su estilo final se verá así:
fuente
Encontré la mezcla de la biblioteca de caligrafía 3 y la publicación de coderwall como mi resultado final.
fuente
Sí, es posible configurar la fuente para toda la aplicación.
La forma más fácil de lograr esto es empaquetar las fuentes deseadas con su aplicación.
Para hacer esto, simplemente cree un activo / carpeta en la raíz del proyecto y coloque sus fuentes (en TrueType, o TTF, formulario) en los activos.
Podría, por ejemplo, crear activos / fuentes / y colocar sus archivos TTF allí.
fuente