Из приложения, которое мне нужно разработать, я получил конкретный шрифт с множеством файлов, например 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 по умолчанию. Интересно, почему?
Я подвел итоги в блоге здесь, в моем блоге , может быть, это кому-то поможет.