He agregado un archivo de fuente personalizado a mi carpeta de recursos / fuentes. ¿Cómo lo uso desde mi XML?
Puedo usarlo desde el código de la siguiente manera:
TextView text = (TextView) findViewById(R.id.textview03);
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf");
text.setTypeface(tf);
¿No puedo hacerlo desde XML usando un android:typeface="/fonts/Molot.otf"
atributo?
Respuestas:
Respuesta corta: No. Android no tiene soporte integrado para aplicar fuentes personalizadas a widgets de texto a través de XML.
Sin embargo, existe una solución que no es muy difícil de implementar.
primero
Deberá definir su propio estilo. En su carpeta / res / values, abra / cree el archivo attrs.xml y agregue un objeto declare-styleable como este:
Segundo
Suponiendo que desee utilizar este widget con frecuencia, debe configurar una caché simple para los
Typeface
objetos cargados , ya que cargarlos desde la memoria sobre la marcha puede llevar tiempo. Algo como:Este le permitirá usar extensiones de archivo .ttc, pero no está probado.
Tercero
Cree una nueva clase que subclases
TextView
. Este ejemplo en particular tiene en cuenta el tipo de letra XML definido (bold
,italic
, etc.) y aplicarlo a la fuente (asumiendo que usted está utilizando un archivo .ttc).Finalmente
Reemplace las instancias de
TextView
en su XML con el nombre de clase completo. Declare su espacio de nombres personalizado como lo haría con el espacio de nombres de Android. Tenga en cuenta que el "typefaceAsset" debe apuntar a un archivo .ttf o .ttc contenido en su directorio / assets.fuente
Aquí hay un código de ejemplo que hace esto. Tengo la fuente definida en una variable final estática y el archivo de fuente está en el directorio de activos.
fuente
Cree su TextView personalizado que pertenece a la fuente que desea utilizar. En esta clase, uso un campo mTypeface estático para almacenar en caché el tipo de letra (para un mejor rendimiento)
En archivo xml:
En la clase java:
fuente
Activity implementa LayoutInflater.Factory2 que proporciona devoluciones de llamada en cada Vista creada. Es posible diseñar TextView con el atributo Familia de fuentes personalizadas, cargar los tipos de letra a pedido y llamar a setTypeface en vistas de texto instanciadas automáticamente.
Desafortunadamente, debido a la relación arquitectónica de las instancias de Inflater en relación con Actividades y Windows, el enfoque más simple para usar fuentes personalizadas en Android es almacenar en caché las fuentes cargadas en el nivel de la Aplicación.
La base de código de muestra está aquí:
https://github.com/leok7v/android-textview-custom-fonts
resultados en
fuente
No es una buena idea usar fuentes personalizadas en xml debido a este hecho , es decir, ¡debe hacerlo mediante programación para evitar la pérdida de memoria!
fuente
¿Quizás pueda usar la reflexión para inyectar / piratear su fuente en la lista estática de fuentes disponibles cuando se crea su aplicación? Estoy interesado en los comentarios de los demás si esta es una idea realmente mala o si es una gran solución , parece que va a ser uno de esos extremos ...
Pude inyectar mi tipo de letra personalizado en la lista de tipos de letra del sistema con mi propio nombre de familia de fuentes, luego especificando ese nombre de familia de fuentes personalizado ("brush-script") como el valor de android: FontFamily en un TextView estándar funcionó en mi LG G4 con Android 6.0.
En mi diseño
fuente
MyApplication
necesario llamar a la clase?y agregue un declarable en attrs.xml
y luego agregue su customFont like
fuente
Sé que esta es una pregunta antigua, pero he encontrado una solución mucho más sencilla.
Primero declare su TextView en xml como de costumbre. Coloque su fuente (TTF o TTC) en la carpeta de activos
Luego, simplemente configure el tipo de letra para su vista de texto en su método onCreate.
Hecho.
fuente
La mejor solución es utilizar (finalmente) introducida por Google una función de fuente personalizada nativa en XML. Pero debes apuntar a API 26. Es compatible con API 16+
https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml
fuente
en lugar de xmlns: custom = "schemas.android.com/tools"; debe usar: xmlns: custom = "schemas.android.com/apk/res-auto"; para utilizar atributos de estilo. Hice este cambio y ahora está funcionando.
fuente