Шрифты
Начиная с уровня API 26 пакет SDK для Android позволяет обрабатывать шрифты как ресурсы, как макеты или рисуемые компоненты. Библиотека поддержки Android 26 NuGet будет поддерживать новые API шрифтов для тех приложений, которые предназначены для API уровня 14 или выше.
После нацеливания на API 26 или установки библиотеки поддержки Android версии 26 можно использовать шрифты в приложении Android двумя способами:
- Упакуйте шрифт как ресурс Android . Это гарантирует, что шрифт всегда будет доступен приложению, но увеличит размер APK.
- Скачивание шрифтов — Android также поддерживает скачивание шрифта из поставщика шрифтов. Поставщик шрифтов проверяет, есть ли шрифт на устройстве. При необходимости шрифт будет скачан и кэширован на устройстве. Этот шрифт может использоваться несколькими приложениями.
Похожие шрифты (или шрифты, которые могут иметь несколько разных стилей) можно сгруппировать в семейства шрифтов. Это позволяет разработчикам указать определенные атрибуты шрифта, например его вес, и Android автоматически выберет соответствующий шрифт из семейства шрифтов.
Библиотека поддержки Android версии 26 будет поддерживать шрифты на уровне API 26. При выборе более старых уровней API необходимо объявить пространство имен XML и присвоить app различным атрибутам app: шрифта имена с помощью android: пространства имен и пространства имен. Если используется только android: пространство имен, шрифты не будут отображаться на устройствах с API уровня 25 или ниже. Например, в этом фрагменте XML объявляется новый ресурс семейства шрифтов , который будет работать на уровне API 14 и выше:
Если шрифты предоставляются приложению Android надлежащим образом, их можно применить к мини-приложению пользовательского интерфейса, задав fontFamily атрибут . Например, в следующем фрагменте кода показано, как отобразить шрифт в TextView:
В этом руководстве сначала рассматривается использование шрифтов в качестве ресурса Android, а затем переход к скачиванию шрифтов во время выполнения.
Шрифты как ресурс
Упаковка шрифта в пакет APK для Android гарантирует, что он всегда будет доступен приложению. Файл шрифта (либо . TTF или . OTF-файл) добавляется в приложение Xamarin.Android так же, как и любой другой ресурс, путем копирования файлов в подкаталог в папке Resources проекта Xamarin.Android. Ресурсы шрифтов хранятся в подкаталоге шрифтов в папке Resources проекта.
Шрифты должны иметь действие сборкиAndroidResource , иначе они не будут упаковываться в окончательный ПАКЕТ APK. Действие сборки должно быть автоматически задано интегрированной среде разработки.
При наличии большого количества похожих файлов шрифтов (например, одного и того же шрифта с разными шрифтами или стилями) их можно сгруппировать в семейство шрифтов.
Семейства шрифтов
Семейство шрифтов — это набор шрифтов с разными весами и стилями. Например, могут существовать отдельные файлы шрифтов для полужирных или курсивных шрифтов. Семейство шрифтов определяется элементами font в XML-файле, который хранится в каталоге Resources/font . Каждое семейство шрифтов должно иметь собственный XML-файл.
Чтобы создать семейство шрифтов, сначала добавьте все шрифты в папку Resources/font . Затем создайте НОВЫЙ XML-файл в папке шрифтов для семейства шрифтов. Имя XML-файла не имеет сходства или связи с шрифтами, на которые ссылается ссылка; Файлом ресурсов может быть любое законное имя файла ресурсов Android. Этот XML-файл будет содержать корневой font-family элемент, содержащий один или несколько font элементов. Каждый font элемент объявляет атрибуты шрифта.
Следующий XML-код является примером семейства шрифтов для шрифта Sources Sans Pro , который определяет множество различных весовых коэффициентов шрифта. Он сохраняется в виде файла в папке Resources/font с именемsourcesanspro.xml:
Атрибут fontStyle имеет два возможных значения:
Атрибут fontWeight соответствует атрибуту CSS font-weight и ссылается на толщину шрифта. Это значение в диапазоне от 100 до 900. В следующем списке описаны общие значения веса шрифта и их имена.
После определения семейства шрифтов его можно использовать декларативно, задав fontFamily атрибуты , textStyle и fontWeight в файле макета. Например, в следующем фрагменте XML задается шрифт весом 600 (обычный) и стиль текста курсивом:
Программное назначение шрифтов
Шрифты можно задать программным способом с помощью Resources.GetFont метода для получения Typeface объекта . Многие представления имеют TypeFace свойство, которое можно использовать для назначения шрифта мини-приложению. В этом фрагменте кода показано, как программно задать шрифт в TextView:
Android.Graphics.Typeface typeface = this.Resources.GetFont(Resource.Font.caveat_regular); textView1.Typeface = typeface; textView1.Text = "Changed the font";
Метод GetFont автоматически загрузит первый шрифт в семействе шрифтов. Чтобы загрузить шрифт, соответствующий определенному стилю Typeface.Create , используйте метод . Этот метод попытается загрузить шрифт, соответствующий указанному стилю. Например, этот фрагмент кода попытается загрузить полужирный Typeface объект из семейства шрифтов, определенного в разделе Resources/fonts:
var typeface = Typeface.Create("", Android.Graphics.TypefaceStyle.Bold); textView1.Typeface = typeface;
Скачивание шрифтов
Вместо упаковки шрифтов в качестве ресурса приложения Android может скачивать шрифты из удаленного источника. Это приведет к уменьшению размера APK.
Шрифты скачиваются с помощью поставщика шрифтов. Это специализированный поставщик содержимого, который управляет загрузкой и кэшированием шрифтов во всех приложениях на устройстве. Android 8.0 включает поставщик шрифтов для скачивания шрифтов из репозитория Google Font. Этот поставщик шрифтов по умолчанию поддерживается на уровне API 14 с помощью библиотеки поддержки Android версии 26.
Когда приложение отправляет запрос на шрифт, поставщик шрифтов сначала проверка, чтобы узнать, есть ли шрифт на устройстве. В противном случае он попытается скачать шрифт. Если не удается скачать шрифт, Android будет использовать системный шрифт по умолчанию. После скачивания шрифт становится доступным для всех приложений на устройстве, а не только для приложения, которое сделало первоначальный запрос.
Когда выполняется запрос на скачивание шрифта, приложение не запрашивает напрямую поставщика шрифтов. Вместо этого приложения будут использовать экземпляр FontsContract API (или , FontsContractCompat если используется библиотека поддержки 26).
Android 8.0 поддерживает скачивание шрифтов двумя разными способами:
- Объявление загружаемых шрифтов в качестве ресурса — приложение может объявлять загружаемые шрифты в Android с помощью XML-файлов ресурсов. Эти файлы будут содержать все метаданные, необходимые Android для асинхронной загрузки шрифтов при запуске приложения и их кэширования на устройстве.
- Программно — API в API Android уровня 26 позволяют приложению скачивать шрифты программным способом во время работы приложения. Приложения создадут FontRequest объект для заданного шрифта и передадут этот объект в FontsContract класс . объект FontsContract принимает FontRequest и извлекает шрифт из поставщика шрифтов. Android будет синхронно скачивание шрифта. Пример создания FontRequest будет показан далее в этом руководстве.
Независимо от того, какой подход используется, ресурсы файлов, которые необходимо добавить в приложение Xamarin.Android перед загрузкой шрифтов. Во-первых, шрифты должны быть объявлены в XML-файле в каталоге Resources/font как часть семейства шрифтов. Этот фрагмент кода является примером того, как скачать шрифты из коллекции Google Fonts с открытым исходным кодом с помощью поставщика шрифтов по умолчанию, который поставляется с Android 8.0 (или библиотекой поддержки версии 26):
Элемент font-family содержит следующие атрибуты, объявляющие сведения, необходимые Android для скачивания шрифтов:
- fontProviderAuthority — полномочия поставщика шрифтов, который будет использоваться для запроса.
- fontPackage — пакет для поставщика шрифтов, который будет использоваться для запроса. Используется для проверки удостоверения поставщика.
- fontQuery — это строка, которая поможет поставщику шрифтов найти запрошенный шрифт. Сведения о запросе шрифта относятся к поставщику шрифтов. Класс QueryBuilder в примере приложения «Загружаемые шрифты» предоставляет некоторые сведения о формате запроса для шрифтов из коллекции Google Fonts с открытым исходным кодом.
- fontProviderCerts — массив ресурсов со списком наборов хэшей для сертификатов, с которыми должен быть подписан поставщик.
После определения шрифтов может потребоваться предоставить сведения о сертификатах шрифтов , связанных с загрузкой.
Сертификаты шрифтов
Если поставщик шрифтов не предустановлен на устройстве или приложение использует библиотеку Xamarin.Android.Support.Compat , Android требует сертификатов безопасности поставщика шрифтов. Эти сертификаты будут перечислены в файле ресурсов массива, который хранится в каталоге Resources/values .
Например, следующий XML-код называется Resources/values/fonts_cert.xml и хранит сертификаты для поставщика шрифтов Google:
- @array/com_google_android_gms_fonts_certs_dev
- @array/com_google_android_gms_fonts_certs_prod
- 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
С помощью этих файлов ресурсов приложение может скачивать шрифты.
Объявление загружаемых шрифтов в качестве ресурсов
Перечисляя загружаемые шрифты в AndroidManifest.XML, Android будет асинхронно скачивать шрифты при первом запуске приложения. Сами шрифты перечислены в файле ресурсов массива, аналогично следующему:
- @font/vt323
Чтобы скачать эти шрифты, они должны быть объявлены в AndroidManifest.XML путем добавления meta-data в качестве дочернего application элемента элемента. Например, если загружаемые шрифты объявлены в файле ресурсов в разделе Resources/values/downloadable_fonts.xml, то этот фрагмент необходимо добавить в манифест:
Скачивание шрифта с помощью API шрифтов
Можно программно скачать шрифт, создав FontRequest экземпляр объекта и передав его методу FontContractCompat.RequestFont . Метод FontContractCompat.RequestFont сначала проверка, чтобы узнать, существует ли шрифт на устройстве, а затем при необходимости будет асинхронно запрашивать поставщик шрифтов и пытаться скачать шрифт для приложения. Если FontRequest не удается скачать шрифт, Android будет использовать системный шрифт по умолчанию.
Объект FontRequest содержит сведения, которые будут использоваться поставщиком шрифтов для поиска и скачивания шрифта. Для требуется FontRequest четыре элемента информации:
- Центр поставщика шрифтов — центр поставщика шрифтов, используемый для запроса.
- Пакет шрифтов — пакет для поставщика шрифтов, который будет использоваться для запроса. Используется для проверки удостоверения поставщика.
- Запрос шрифта — это строка, которая поможет поставщику шрифтов найти запрошенный шрифт. Сведения о запросе шрифта относятся к поставщику шрифтов. Сведения о строке зависят от поставщика шрифтов. Класс QueryBuilder в примере приложения «Загружаемые шрифты» предоставляет некоторые сведения о формате запроса для шрифтов из коллекции Google Fonts с открытым исходным кодом.
- Сертификаты поставщика шрифтов — массив ресурсов со списком наборов хэшей для сертификатов, с которыми должен быть подписан поставщик.
Этот фрагмент кода является примером создания экземпляра нового FontRequest объекта:
FontRequest request = new FontRequest("com.google.android.gms.fonts", "com.google.android.gms", , Resource.Array.com_google_android_gms_fonts_certs);
В предыдущем фрагменте FontToDownload кода приведен запрос, который поможет шрифту из коллекции Google Fonts Open Source.
Перед передачей FontRequest в FontContractCompat.RequestFont метод необходимо создать два объекта:
- FontsContractCompat.FontRequestCallback — Это абстрактный класс, который необходимо расширить. Это обратный вызов, который будет вызываться после RequestFont завершения. Приложение Xamarin.Android должно быть подклассом FontsContractCompat.FontRequestCallback и переопределять OnTypefaceRequestFailed и OnTypefaceRetrieved , предоставляя действия, которые необходимо выполнить при сбое или успешном скачивании соответственно.
- Handler — это Handler , который будет использоваться для RequestFont скачивания шрифта в потоке, если это необходимо. Шрифты не следует загружать в поток пользовательского интерфейса.
Этот фрагмент кода является примером класса C#, который асинхронно загружает шрифт из коллекции Google Fonts с открытым исходным кодом. Он реализует FontRequestCallback интерфейс и вызывает событие C# после FontRequest завершения.
public class FontDownloadHelper : FontsContractCompat.FontRequestCallback < // A very simple font query; replace as necessary public static readonly String FontToDownload = "Courgette"; Android.OS.Handler Handler = null; public event EventHandlerFontDownloaded = delegate < // just an empty delegate to avoid null reference exceptions. >; public void DownloadFonts(Context context) < FontRequest request = new FontRequest("com.google.android.gms.fonts", "com.google.android.gms",FontToDownload , Resource.Array.com_google_android_gms_fonts_certs); FontsContractCompat.RequestFont(context, request, this, GetHandlerThreadHandler()); >public override void OnTypefaceRequestFailed(int reason) < base.OnTypefaceRequestFailed(reason); FontDownloaded(this, new FontDownloadEventArg(null)); >public override void OnTypefaceRetrieved(Android.Graphics.Typeface typeface) < base.OnTypefaceRetrieved(typeface); FontDownloaded(this, new FontDownloadEventArg(typeface)); >Handler GetHandlerThreadHandler() < if (Handler == null) < HandlerThread handlerThread = new HandlerThread("fonts"); handlerThread.Start(); Handler = new Handler(handlerThread.Looper); >return Handler; > > public class FontDownloadEventArg : EventArgs < public FontDownloadEventArg(Android.Graphics.Typeface typeface) < Typeface = typeface; >public Android.Graphics.Typeface Typeface < get; private set; >public bool RequestFailed < get < return Typeface != null; >> >
Чтобы использовать эту вспомогатель, создается новый FontDownloadHelper объект и назначается обработчик событий:
var fontHelper = new FontDownloadHelper(); fontHelper.FontDownloaded += (object sender, FontDownloadEventArg e) => < //React to the request >; fontHelper.DownloadFonts(this); // this is an Android Context instance.
Итоги
В этом руководстве рассматриваются новые API в Android 8.0 для поддержки загружаемых шрифтов и шрифтов в качестве ресурсов. В нем говорилось, как внедрить существующие шрифты в APK и использовать их в макете. В нем также обсуждалось, как Android 8.0 поддерживает скачивание шрифтов из поставщика шрифтов программным способом или путем объявления метаданных шрифта в файлах ресурсов.
Связанные ссылки
- fontFamily
- FontRequest
- FontsContractCompat
- Resources.GetFont
- Шрифт
- Библиотека поддержки Android 26 NuGet
- Использование шрифтов в Android
- Спецификация веса шрифта CSS
- Коллекция Google Fonts с открытым исходным кодом
- Источник Sans Pro
Использование Downloadable Fonts в приложении

Ранее мы писали о том, Google добавили в Android поддержку шрифтов из своего каталога Google Fonts. В этой статье мы подробно рассмотрим, как можно это реализовать в своём приложении.
Благодаря Google Fonts вы можете использовать тысячи самых разных шрифтов в своих приложениях. Более того, эта возможность теперь распространяется не только на Android O (API 26), но также на все устройства, начиная с API 14, благодаря использованию библиотеки поддержки.
Использование загружаемых шрифтов несёт в себе следующие преимущества:
- уменьшение размера APK (вам не нужно включать в проект .ttf файлы со шрифтами);
- приложение на устройстве пользователя могут совместно использовать шрифты из одного источника, не раздувая хранилище избыточными файлами.
Как это работает?
Благодаря встроенной поддержке шрифтов, особенно подчёркивается второй пункт. Например, ниже представлена схема, по которой разные приложения могут пользоваться общими шрифтами.

По этой схеме можно увидеть, что приложения, запрашивающие шрифты, обращаются к одному поставщику, указав контракт на шрифт. Поэтому если одно приложение уже запросило шрифт, другие приложения не будут запускать загрузку и сразу получат шрифт из кеша.
Такая схема необходима, чтобы система не вносила вредоносного кода в файлы.
Реализация
В приложении Фонарик используется таймер со специальным шрифтом, который хранится в папке assets проекта. Чтобы уменьшить размер APK файла, перепишем приложение, используя загружаемые шрифты.
Добавить загружаемые шрифты в своё приложение можно двумя способами.
Через Android Studio
Чтобы добавить таким способом, перейдём на разметку с виджетом, шрифт которого нужно изменить. На вкладке Design нужно кликнуть по виджету, затем в свойствах найти fontFamily и выбрать More fonts…

Откроется окно со списком всех шрифтов, доступных в Google Fonts, где можно выбрать любой понравившийся. Выберем шрифт Orbitron и нажмём ОК. Важно здесь выбрать именно Create downloable font, поскольку Add font to project просто добавит шрифт в проект, что противоречит текущей цели.
После этого Android Studio сама создаст необходимые файлы. В папке res/font будет создан файл orbitron.xml, в папке res/values файлы preloaded_fonts.xml и font_certs.xml.
orbitron.xml
Этот файл содержит определения для Android о семействе шрифтов. Как вы можете видеть, в нём перечислены fontProvider, fontProviderCerts, которые были автоматически созданы в Android Studio.
preloaded_fonts.xml
- @font/orbitron
Android Studio создаёт этот файл, чтобы помочь предварительно загрузить шрифты. Это нужно, чтобы избежать задержки, когда шрифт не отображается при старте приложения. Рендеринг картинки является синхронным процессом, поэтому первый рендер может занять некоторое время, пока Android загружает шрифт. Объявление этого файла в манифесте нужно для того, чтобы приложение получило шрифт в начале работы, до отрисовки экрана.
Android Studio сама добавляет в манифест метатег, содержащий путь до файла preloaded_fonts.xml.
font_certs.xml
Этот файл содержит огромные зашифрованные сертификаты, которые проверяют шрифты.
Теперь мы может просто указать в разметке у любого виджета свой шрифт в атрибуте fontFamily и увидеть результат.

Здесь новый шрифт используется только у одного виджета. Если вы хотите поменять шрифт всего приложения, вам нужно перейти в styles.xml и добавить его в тему вашего приложения.
Как использовать загружаемые шрифты на старых устройствах?
Для этого вам нужно добавить библиотеку поддержки в файл build.gradle модуля приложения.
compile "com.android.support:support-compat:27.0.1"
Кроме того, библиотека поддержка была перенесена в maven репозиторий Google, поэтому вам больше не нужен SDK Manager для загрузки библиотеки. Чтобы добавить maven репозиторий Google, добавьте следующую строку в repositories файла build.gradle модуля проекта.
repositories
Программное добавление загружаемых шрифтов
Чтобы добавить шрифт программно, нам понадобятся два класса:
- FontRequest для создания запроса на получение шрифта
- FontsContract для создания объекта Typeface после получения результата запроса шрифта
Приложение будет извлекать шрифты из провайдера с помощью API FontsContract. У каждого провайдера есть свой собственный набор ограничений на версии Android и язык запросов, который он поддерживает.
Итак, для начала создадим экземпляр класса FontRequest.
FontRequest fontRequest = new FontRequest("com.google.android.gms.fonts", "com.google.android.gms", "Orbitron", R.array.com_google_android_gms_fonts_certs);
В параметрах указываются:
- Владелец провайдера шрифтов
- Пакет провайдера шрифтов для проверки личности провайдера
- Строка запроса шрифта. О том, как формируется запрос, мы писали здесь.
- Список сертификатов. Необязателен, если вы запрашиваете шрифты из предустановленных провайдеров, однако необходим, если используется библиотека поддержки.
Затем нужно создать экземпляр класса FontsContractCompat.FontRequestCallback, чтобы получить результат выполнения запроса в виде объекта Typeface или же сообщение об ошибке в случае неудачи.
FontsContractCompat.FontRequestCallback fontRequestCallback = new FontsContractCompat.FontRequestCallback() < @Override public void onTypefaceRetrieved(Typeface typeface) < pb.setTypeface(typeface); >@Override public void onTypefaceRequestFailed(int reason) < Toast.makeText(MainActivity.this, "Failed download font programmatically", Toast.LENGTH_LONG).show(); >>;
Теперь достаточно вызвать метод FontsContract.requestFont(), чтобы получить шрифт. Этот метод проверит, находится ли шрифт в кеше. Если его там нет, то он обращается к провайдеру шрифтов, чтобы извлечь шрифт и передать в callback.
FontsContract.requestFont(this, fontRequest, fontRequestCallback, getThreadHandler());
Как только FontRequestCallback получает объект Typeface, он устанавливает его в нужный виджет. Это наглядно можно увидеть на GIF ниже.
Заключение
Вот и всё! Теперь с помощью загружаемых шрифтов вы можете использовать огромный ассортимент самых разных шрифтов и при этом не увеличивать размер вашего APK файла.
Совет: Работа с пользовательскими шрифтами в Android O
В этой серии мы рассмотрим некоторые из перспективных функций пользовательского интерфейса, с которыми вы можете начать экспериментировать сегодня, через Android O Developer Preview.
В первом совете я показал вам, как настроить разработку для поддержки этого раннего предварительного просмотра O, и как создавать текст, который автоматически масштабируется и уменьшается в соответствии с текущей конфигурацией экрана. В этом совете мы рассмотрим, как Android O сделает работу с пользовательскими шрифтами без проблем.
Добавление пользовательских шрифтов в ваш проект
Вы когда-нибудь хотели выделить определенный фрагмент текста? Или, может быть, вы были уверены, что нестандартный шрифт будет идеальным способом добавить дополнительную индивидуальность в ваше приложение?
Хотя использование пользовательских шрифтов имеет много преимуществ, работа с ними в Android традиционно была болезненным процессом, требующим от вас использования библиотеки или создания собственного View .
К счастью, работа с пользовательскими шрифтами в Android станет намного проще, поскольку пользовательские шрифты станут полностью поддерживаемым типом ресурса в Android O. Это означает, что добавить пользовательский шрифт в ваше приложение будет так же просто, как и добавить любой другой ресурс. такие как изображения и текст.
Чтобы следовать этому уроку, вам понадобятся файлы шрифтов, которые вы можете добавить в проект Android O, который мы создали в первой части .
Android O поддерживает форматы .otf (OpenType) и .ttf (TrueType). Существует множество сайтов, предлагающих такие шрифты бесплатно, поэтому потратьте несколько минут на поиск в Google, пока не найдете нужный вам шрифт.
Поскольку мы просто экспериментируем с новыми функциями Android O, не имеет особого значения, какой шрифт вы используете, но когда вы ищете шрифты для использования в рабочих выпусках вашего приложения, вы всегда должны проверять положения и условия этого шрифта. Тот факт, что ресурс можно загрузить бесплатно, не означает, что нет никаких ограничений на использование и распространение этого ресурса, поэтому всегда проверяйте мелкий шрифт!
Вы также должны учитывать цель, содержание и целевую аудиторию вашего приложения, так как разные шрифты передают разные сообщения. Если вы разрабатываете приложение, чтобы помочь людям заполнить свои налоговые декларации, ваша аудитория может с трудом воспринимать финансовые и юридические рекомендации вашего приложения, если оно написано странным и причудливым шрифтом!
Найдя шрифт, с которым вы хотите работать, скачайте и распакуйте его. На этом этапе вы должны проверить имя файла шрифта на наличие недопустимых символов — по сути, всего, что не является строчными az, 0-9 или подчеркиванием. Попробуйте добавить любые другие символы, и Android Studio выдаст ошибку, как только вы попытаетесь сослаться на этот ресурс.
Когда у вас есть файлы шрифтов, вам нужно где-то их хранить:

- Щелкните правой кнопкой мыши папку app / res вашего проекта и выберите « Создать»> «Каталог ресурсов Android» .
- Откройте выпадающее меню и выберите шрифт .
- Введите шрифт в качестве имени файла .
- Нажмите ОК .
- Перетащите файлы шрифтов в новую папку res / font .
Использование ваших пользовательских шрифтов
Вы можете применить собственный шрифт к своему тексту, используя новый атрибут android:fontFamily XML:
Как задать в приложении свой шрифт?
Как добавить в приложение свой шрифт и присвоить элементу TextView?
Отслеживать
задан 7 июн 2015 в 22:38
153 2 2 золотых знака 3 3 серебряных знака 14 14 бронзовых знаков
Пожалуйста, обратите ваше внимание: google.com.ua/…
8 июн 2015 в 5:21
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
TextView textView = (TextView) findViewById(); Typeface typeFace = Typeface.createFromAsset(getAssets(), ""); textView.setTypeface(typeFace);
Но лучше (ну, просто кто-то любит более полные решения и не любит копировать одно и то же для всех 128 TexView в приложении) отнаследоваться от TextView:
public class FontableTextView extends TextView < public FontableTextView(Context context) < super(context); >public FontableTextView(Context context, AttributeSet attrs) < super(context, attrs); UiUtil.setCustomFont(this, context, attrs, R.styleable.com_example_foo_view_FontableTextView, R.styleable.com_example_foo_view_FontableTextView_font); >public FontableTextView(Context context, AttributeSet attrs, int defStyle) < super(context, attrs, defStyle); UiUtil.setCustomFont(this, context, attrs, R.styleable.com_example_foo_view_FontableTextView, R.styleable.com_example_foo_view_FontableTextView_font); >>
public class UiUtil < public static final String TAG = "UiUtil"; public static void setCustomFont(View textViewOrButton, Context ctx, AttributeSet attrs, int[] attributeSet, int fontId) < TypedArray a = ctx.obtainStyledAttributes(attrs, attributeSet); String customFont = a.getString(fontId); setCustomFont(textViewOrButton, ctx, customFont); a.recycle(); >private static boolean setCustomFont(View textView, Context ctx, String asset) < if (TextUtils.isEmpty(asset)) return false; Typeface tf = null; try < tf = getFont(ctx, asset); if (textView instanceof TextView) < ((TextView) textView).setTypeface(tf); >> catch (Exception e) < Log.e(TAG, "Could not get typeface: " + asset, e); return false; >return true; > private static final Hashtable> fontCache = new Hashtable>(); public static Typeface getFont(Context c, String name) < synchronized (fontCache) < if (fontCache.get(name) != null) < SoftReferenceref = fontCache.get(name); if (ref.get() != null) < return ref.get(); >> Typeface typeface = Typeface.createFromAsset( c.getAssets(), "fonts/" + name ); fontCache.put(name, new SoftReference(typeface)); return typeface; > > >
Сам шрифт положить в assets/fonts, в частности:
assets/fonts/coolfont.ttf
