z aplikacji muszę się rozwijać, Dostałem konkretnej czcionki, która ma wiele plików jak fontName-Regular, fontName-Bold, fontName-it. Muszę go używać we wszystkich odsłonach w aplikacji. Najpierw myślałem, że to łatwe zadanie. Spójrz SO i znalazłem bardzo ładny wątek: hereniestandardowe czcionki and Custom TextView na Androida
Więc najpierw zrobiłem tak:
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
}
}
I nazywa ta metoda podczas onCreate w mojej działalności. Każdy tekst w mojej aplikacji pokazywał tę czcionkę i chłopca, byłam szczęśliwa, bo tak łatwo mi było uciec. Dopóki nie dotarłem do ekranu, na którym wymagane były pewne wyskoki tekstu, Bold jako Style
(). Wtedy zdałem sobie sprawę, że to rozwiązanie nie daje mi możliwości załadowania pliku Font-Bold .ttf z zasobów.
niż wyglądało dalej i zobaczyłem piękny zwyczaj TextView realizację, w tym samym SO pytanie:
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);
}
}
To wygląda jeszcze lepiej. Moje pytanie brzmi: jak mogę wykryć na init()
, jeśli moje sterowanie ma Styl ustawiony na pogrubienie, czy nie, więc mogę przypisać żądane TypeFace?
Dziękuję za poświęcony czas.
LE. Zgodnie z poniższym przykładzie, zaktualizowałem moją klasę jako:
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*/);
}
}
}
Dobrze jeśli debugować, aplikacja przechodzi w setTypeFace i wydaje się, aby zastosować pogrubienie jeden, ale w moim układzie nie widzę żadnej zmiany , nie pogrubiony. Bez względu na używaną czcionkę, nie dokonuję żadnych zmian w moim TextView i jest wyświetlana z domyślną czcionką Androida. Zastanawiam się dlaczego ?
Podsumowałem wszystko na blogu: here on my blog może to pomoże komuś.
Thanks do szczegółowego pytania i opracowania oraz świetnego posta na blogu!Idealne dla mnie. Podklasowałem również Button dla tego samego wyniku. Moje jedyne zapytanie to w.r.t. efektywność wywoływania createFromAsset() _ everyry_ time. Czy byłoby lepiej załadować czcionki raz i zapisać je w klasie Application i uzyskać do nich dostęp z MyTextView.setTypeface()? –
Dzięki za twoje słowa. Myślałem o tym również, ale nie testowałem, aby zobaczyć, jak działa. Powinno działać dobrze. W każdym razie nie widziałem żadnej kary za skuteczność z wieloma widokami na ekranie. – Alin