Создание класса помощника TypeFace

У меня около 10-15 Activity или Fragment 's в моем приложении. У меня около 5 различных типов, которые я использую (в основном варианты Roboto ).

Почти в каждом классе я должен это сделать:

 roboto_light = Typeface.createFromAsset(getActivity().getAssets(), "fonts/roboto_light.ttf"); roboto_thin = Typeface.createFromAsset(getActivity().getAssets(), "fonts/roboto_thin.ttf"); roboto_regular = Typeface.createFromAsset(getActivity().getAssets(), "fonts/roboto_regular.ttf"); 

Не все классы используют все пять. Некоторые используют 1, некоторые используют 4, некоторые используют 3, в то время как другие могут использовать другую комбинацию из 3.

Объявление этого кода в каждом классе кажется излишним. Могут ли все 5 шрифтов быть объявлены один раз, возможно, когда приложение запустится, а затем я использую класс помощника, чтобы статически их использовать?

Я не уверен, должен ли я сделать это – если возможно вообще – в классе, расширяющем приложение, или просто в обычном классе, который я могу статически вызвать? И где это будет инициализировано?

Я не уверен, должен ли я сделать это – если возможно вообще – в классе, расширяющем приложение, или просто в обычном классе, который я могу статически вызвать?

В любом случае. Существует несколько примеров реализации, которые все «кешируют» последние несколько типов лиц. Если я правильно помню, на более поздних платформах Android кэширование также происходит под капотом. В любом случае базовая реализация будет выглядеть так:

 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)){ Typeface t = Typeface.createFromAsset(c.getAssets(), String.format("fonts/%s.ttf", name)); cache.put(name, t); } return cache.get(name); } } } 

Источник: https://code.google.com/p/android/issues/detail?id=9904#c3

Это использование вспомогательного класса, но вы также можете сделать его частью своего собственного расширения Application . Он создает тип лиц лениво: он пытается сначала извлечь лицо типа из локального кеша и только создает новый экземпляр, если он недоступен из кеша. Просто поставьте Context и имя лица типа для загрузки.

Если вы один из немногих счастливчиков, использующих minApi 24, вам не нужно ничего делать, поскольку createFromAsset() имеет кэш Typeface createFromAsset() API-интерфейс 24. Если нет, обратитесь к ответу @ MH.