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