Довольно часто есть необходимость в кастомизации стандартных элементов. Как пример, хотите использовать шрифты отличные от стандартных. О возможных проблемах при работе с шрифтами под Android и хочу рассказать.
Во-первых, посмотрим как можно подключить свой шрифт, если он лежит в assets/fonts директории:
Typeface tf = Typeface.createFromAsset(ctx.getAssets(), "fonts/myfont"); setTypeface(tf);
Вроде всё просто. Вот только, если у вас элементов около 200 (скажем, в списке ListView), то для каждого будет создан экземпляр Typeface
. Как пишут, могут возникнуть утечки памяти на устройствах с Froyo (и некоторых других). Поэтому, предлагают кэшировать уже созданные экземпляры шрифтов.
Выглядеть это будет так:
public class Typefaces { private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>(); public static Typeface get(Context c, String name) { synchronized (cache) { if (!cache.containsKey(name)) { String path = "fonts/"+name; try { Typeface t = Typeface.createFromAsset(c.getAssets(), path); cache.put(name, t); } catch (Exception e) { e.printStackTrace(); } } return cache.get(name); } } }
Использовать так:
Typeface tf = Typefaces.get(getContext(), "MyFont"); setTypeface(tf);
Теперь утечки памяти не страшны. К тому же, работать такой код будет быстрее. Если вы попробуете создать одновременно 100-200 TextView
с кастомным шрифтом, не кэшируя его, то сие дело может занять несколько секунд, что не очень понравится юзеру. А с кэшированием элементы будут созданы практически мгновенно.