d'une application que je dois développer, j'ai reçu une police spécifique qui a de nombreux fichiers comme NomPolice-Regular, NomPolice-Bold, NomPolice-it. Je dois l'utiliser dans tous les textviews de l'application. J'ai d'abord pensé que c'était une tâche facile. Regardez SO et a trouvé un fil très agréable: herede polices personnalisées et sur mesure Textview sur Android
Alors d'abord j'ai aimé:
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
}
}
et a appelé cette méthode pendant onCreate dans mon activité. Chaque textView dans mon application montrait cette police et mon garçon, étais-je heureux de m'évader si facilement. Jusqu'à ce que j'arrive à un écran où certains textviews requis Gras comme Style
(android:textStyle="bold"
). Puis j'ai réalisé que cette solution ne me donne pas la possibilité de charger le Font-Bold .ttf des actifs.
Than a regardé plus loin et a vu une belle mise en œuvre TextView personnalisée, dans la même question 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);
}
}
Cela semble encore mieux. Ma question est: comment puis-je détecter sur init()
si mon contrôle a le style mis en gras ou pas, donc je peux assigner le TypeFace demandé?
Nous vous remercions de votre temps.
LE. Suivant l'exemple ci-dessous, je l'ai mis à jour ma classe comme:
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*/);
}
}
}
Eh bien, si je déboguer, l'application va dans setTypeFace et il semble appliquer une audacieuse, mais ma mise en page, je ne vois aucun changement , pas gras. Quelle que soit la police que j'utilise, aucune modification n'est effectuée dans mon TextView et s'affiche avec la police android par défaut. Je me demande pourquoi ?
J'ai tout résumé sur un article de blog here on my blog peut-être que cela aidera quelqu'un.
Merci pour la question détaillée et l'élaboration, et le grand blog!Travaillé parfaitement pour moi. J'ai également sous-classé Button pour le même résultat. Ma seule requête est w.r.t. l'efficacité d'appeler createFromAsset() _every_ time. Serait-il préférable de charger les polices une fois et de les stocker dans votre classe Application, et d'y accéder à partir de MyTextView.setTypeface()? –
Merci pour vos paroles. J'ai pensé à cela aussi, mais je n'ai pas testé pour voir comment ou si ça fonctionne. Cela devrait fonctionner correctement. De toute façon je n'ai vu aucune pénalité de performance avec de nombreuses vues sur un écran. – Alin