Как стать автором
Обновить

Комментарии 11

Ожидал чего-то большего, а не просто кастомную текстВьюшку. И этот подход вовсе не решает проблему использования кастомного шрифта во Всём проекте — ведь ещё есть кнопки, спиннеры, диалоги,…
И правда, статья повторяет любой пост, либого форума про добавление шрифта.
В этом решении есть одна проблема — для каждого TextView вы будете выполнять загрузку шрифта из ассетов и создавать сам экземпляр шрифта. Нужно как минимум реализовать статическое хранение шрифта.
Подскажите как?
Возможно в классе Application реализовать подгрузку
Вот так
private static Typeface arialTypeface;
public static final Typeface Arial(Context ctx) {
        if (arialTypeface == null) {
            arialTypeface = Typeface.createFromAsset(ctx.getAssets(), "fonts/arial.ttf");
        }
        return arialTypeface;
    }
Чуть улучшенный вариант (соблюдены соглашения о именовании, а «arialTypeface» не захардкорено = в любой момент можно использовать любой шрифт, не добавляя в код лишний «private static Typeface ...»):

    public static final HashMap<String, Typeface> sTypefaceCache = new HashMap<String, Typeface>();
    public static final Typeface getTypeface(AssetManager mgr, String path) {
        if(!sTypefaceCache.containsKey(path)) {
            Typeface tf = Typeface.createFromAsset(mgr, path);
            sTypefaceCache.put(path, tf);
        }
        return sTypefaceCache.get(path);
    }
Еще один способ решения, применить на рутовый элемент лейаута во такой утилитный метод,
он автоматически пробежит по всем текстовым элементам и подставит им ваш Typeface с новым шрифтом:
public static void applyCustomFont(ViewGroup list, Typeface customTypeface) {
        for (int i = 0; i < list.getChildCount(); i++) {
            View view = list.getChildAt(i);
            if (view instanceof ViewGroup) {
                applyCustomFont((ViewGroup) view, customTypeface);
            } else if (view instanceof TextView) {
                ((TextView) view).setTypeface(customTypeface);
            }
        }
    }
Вы перепутали ссылку на источник и забыли пометить пост как перевод.
Мое предположение строится на этом ответе со StackOverflow ( http://stackoverflow.com/a/7197867/1219241 ), который полностью повторяет ваш код и которым я сам пользовался несколько дней назад.
Повторю одно из своих предложений «Нашел один из вариантов...». В общем то я и не претендовал на авторское право к вашему сведению
Создавать кастомный вью и бегать по иерархии вью — не лучшие способы. Я использую кастомный LayoutInflater.Factory. Полный код класса и пример использования можно посмотреть здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории