Пользовательские шрифты и пользовательский текстовый просмотр на Android

Из приложения, которое мне нужно разработать, я получил конкретный шрифт с множеством файлов, например FontName-Regular, FontName-Bold , FontName-it . Мне нужно использовать его во всех текстовых представлениях в приложении. Сначала я подумал, что это простая задача. Просмотрите SO и обнаружите очень интересную ветку: здесь

Итак, сначала мне понравилось:

public static void overrideFonts(final Context context, final View v) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideFonts(context, child);
            }
        } else if (v instanceof TextView) {
            ((TextView)v).setTypeface(FONT_REGULAR);
        }
    } catch (Exception e) {
        e.printStackTrace();
        // ignore
    }
}

И я вызвал этот метод во время onCreate в моей деятельности. Каждый textView в моем приложении показывал этот шрифт, и, черт возьми, я счастлив, что так легко ушел. Пока я не добрался до экрана, где для некоторых текстовых представлений требовалось Полужирный как Стиль ( android: textStyle = "bold" ). Затем я понял, что это решение не дает мне возможности загружать Font-Bold .ttf из ресурсов.

Затем он посмотрел дальше и увидел красивую реализацию TextView в том же вопросе SO:

public class MyTextView extends TextView {

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyTextView(Context context) {
        super(context);
        init();
    }

    public void init() {

        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf");
        setTypeface(tf ,1);

    }
    }

Это выглядит даже лучше. У меня вопрос: как я могу определить в init () , установлен ли в моем элементе Style Bold или нет, чтобы я мог назначить запрошенный TypeFace?

Спасибо за ваше время.

LE. Следуя приведенному ниже примеру, я обновил свой класс как:

public class MyTextView extends TextView {

    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR);
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(),  Constants.FONT_BOLD);

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTextView(Context context) {
        super(context);
    }

    public void setTypeface(Typeface tf, int style) {
        if (style == Typeface.BOLD) {
            super.setTypeface(boldTypeface/*, -1*/);
        } else {
            super.setTypeface(normalTypeface/*, -1*/);
        }
    }
}

Хорошо, если я отлаживаю, приложение переходит в setTypeFace и, кажется, применяет полужирный шрифт, но в моем макете я не вижу никаких изменений, кроме полужирного.Независимо от того, какой шрифт я использую, в моем TextView не происходит никаких изменений, и он отображается со шрифтом Android по умолчанию. Интересно, почему?

Я подвел итоги в блоге здесь, в моем блоге , может быть, это кому-то поможет.

18
задан Community 23 May 2017 в 12:31
поделиться