Cómo usar una tipografía personalizada en Android
Muchas veces queremos utilizar en nuestras aplicaciones una fuente distinta de la predeterminada. ¿Cómo logramos esto? A continuación explicaremos cómo y utilizar una tipografía personalizada en Android en unos brevísimos pasos. En este primer tutorial veremos cómo cambiar la fuente mediante código y en la segunda parte veremos cómo crear una clase que herede de TextView que nos permita cambiar la tipografía desde el archivo xml.Paso a paso
Utilizar una tipografía personalizada en Android consta de tres pasos:- Importar la tipografía
- Crear una clase que gestione la tipografía
- Utilizar la tipografía
1. Importar la tipografía
Uno de los aspectos más ignorados por aquellos tutoriales sobre tipografía es la ubicación de las mismas. Todos los tutoriales dicen que deben copiarse los archivos de fuentes en la carpeta assets, pero nadie dice dónde debe estar esta carpeta. Pues bien, esta es la ruta en nuestro proyecto:carpetaProyecto/app/src/main/assets
2. Crear una clase que gestione la tipografía
No debemos obtener la tipografía directamente porque en algunos dispositivos (antiguos) puede producir fugas de memoria ya que cargan la fuente una y otra vez. (Aquí se trata el tema:https://code.google.com/p/android/issues/detail?id=9904
). Para evitar esto, vamos a crear una clase que gestione su obtención. Crea la siguiente clase en tu proyecto:
TypefacesUtils.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class TypefacesUtils { private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>(); public static Typeface get(Context context, String rutaFuente) { synchronized (cache) { if (!cache.containsKey(rutaFuente)) { try { Typeface t = Typeface.createFromAsset(context.getAssets(), rutaFuente); cache.put(rutaFuente, t); } catch (Exception e) { System.out.println("No se ha podido cargar la fuente en '" + rutaFuente + "' porque " + e.getMessage()); return null; } } return cache.get(rutaFuente); } } } |
3. Utilizar la tipografía
Si no hubiéramos querido seguir el paso anterior, el método para cambiar la tipografía la tipografía de una vista essetTypefaces()
:
1 |
textView.setTypeface(Typeface.createFromAsset(context.getAssets(), rutaFuente)) |
1 2 |
Typeface dejavu = TypefacesUtils.get(this, "fonts/DejaVuSans.ttf"); textView.setTypeface(dejavu); |
TypefacesUtils.get()
, si es la primera vez, la Hashtable estará vacía, por lo que la obtiene de la carpeta assets y la guarda en la Hashtable utilizando la ruta indicada como clave. La próxima vez que llamemos al método pidiendo la misma fuente, comprobará que en la Hashtable ya hay una fuente guardada para la ruta que hemos especificado por lo que, en lugar de volver a crearla desde assets, la tomará de la tabla, ahorrándose esa operación.
Otro pequeño asunto al que tenemos que hacer referencia es una optimización del uso de la memoria. ¿A qué nos referimos? A no usar recursos cuando no es necesario hacerlo. ¿Para qué vamos a volver a asignar la tipografía a una vista que ya la tiene asignada? Es un desperdicio de memoria.
Para evitar esto solo tenemos que comprobar antes de asignar la tipografía, si la vista ya la tiene asignada mediante el siguiente código:
1 2 3 4 |
if (textView.getTypefaces() != null && !textView.getTypeface().equals(Typefaces.get(this, "fonts/DejaVuSans.ttf")) Typeface dejavu = TypefacesUtils.get(this, "fonts/DejaVuSans.ttf"); textView.setTypeface(dejavu); |