2012-01-21 6 views
17

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.

+0

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()? –

+0

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

Répondre

24

Le constructeur de TextView appelle setTypeface(Typeface tf, int style) avec le paramètre style récupéré à partir de l'attribut XML android:textStyle. Donc, si vous voulez intercepter cet appel à la force de votre propre police de caractères que vous pouvez remplacer cette méthode comme suit:

public void setTypeface(Typeface tf, int style) { 
    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf"); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf"); 

    if (style == Typeface.BOLD) { 
     super.setTypeface(boldTypeface/*, -1*/); 
    } else { 
     super.setTypeface(normalTypeface/*, -1*/); 
    } 
} 
+0

Votre solution semble correcte, mais elle ne fonctionne pas .... – Alin

+2

@Alin: Le problème était que 'setTypeface()' est appelé par les constructeurs avant que 'Typeface's aient été créés! Donc, déplacez la création de 'Typeface's dans' setTypeface() 'et maintenant ça va marcher! –

+0

Maintenant ça marche, merci. Grâce à toi, ma journée est réussie. – Alin

9

Vous pouvez utiliser mon CustomTextView qui vous permet de spécifier un nom de fichier de police dans votre dossier assets:

https://github.com/mafshin/CustomTextView

et l'utilisation est très simple:

<com.my.app.CustomTextView 
     xmlns:custom="http://schemas.android.com/apk/res/com.my.app"    
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Test text" 
     android:id="@+id/testcustomview" 

     custom:fontAssetName="Politica XT.otf" 
     /> 
2

je pense qu'il est préférable de creat e votre package pour les polices personnalisées et de les importer dans votre projet afin que vous puissiez les utiliser plus tard dans le futur

package com.codeslips.utilities; 

    import android.content.Context; 
    import android.graphics.Typeface; 
    import android.util.AttributeSet; 
    import android.widget.TextView; 

    public class CustomTextView extends TextView { 

      public CustomTextView(Context context) 
       { super(context); setFont(); } 

      public CustomTextView(Context context,AttributeSet set) 
      { super(context,set); setFont(); } 

      public CustomTextView(Context context,AttributeSet set,int defaultStyle) 
      { super(context,set,defaultStyle); setFont(); } 

      private void setFont() { 

      Typeface typeface=Typeface.createFromAsset(getContext().getAssets(),"fonts/your-font.ttf"); 
      setTypeface(typeface); //function used to set font 

      } 
      } 

utiliser maintenant la classe ci-dessus dans votre fichier XML pour avoir votre police personnalisée

<com.codeslips.utilities.CustomTextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:text="Upload Image" 
     android:paddingTop="10sp" 
     android:textSize="14sp" 
     android:layout_weight="0.7" 
     android:textColor="@android:color/white"/> 
Questions connexes