web-dev-qa-db-fra.com

Définir la police pour tous les textViews en activité?

Est-il possible de définir la police pour tous les TextViews d'une activité? Je peux définir la police pour un seul textView en utilisant: 

    TextView tv=(TextView)findViewById(R.id.textView1); 
    Typeface face=Typeface.createFromAsset(getAssets(), "font.ttf"); 
    tv.setTypeface(face);

Mais je voudrais changer tous les textViews à la fois, au lieu de le définir manuellement pour chaque textView, toute information serait appréciée!

51
William L.

Solution1 :: Appelez simplement ces méthodes en passant l'argument parent.

private 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(Typeface.createFromAsset(context.getAssets(), "font.ttf"));
        }
    } catch (Exception e) {
 }
 }

Solution2 :: vous pouvez sous-classer la classe TextView avec votre police personnalisée et l'utiliser à la place de textview.

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();
    }

    private void init() {
        if (!isInEditMode()) {
            Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font.ttf");
            setTypeface(tf);
        }
    }

}
89
Shankar Agarwal

Celui de ma collection personnelle:

private void setFontForContainer(ViewGroup contentLayout) {
    for (int i=0; i < contentLayout.getChildCount(); i++) {
        View view = contentLayout.getChildAt(i);
        if (view instanceof TextView)
            ((TextView)view).setTypeface(yourFont);
        else if (view instanceof ViewGroup)
            setFontForContainer((ViewGroup) view);
    }
}
8
Red Hot Chili Coder

Si vous recherchez une solution de programmation plus générale, j'ai créé une classe statique qui peut être utilisée pour définir la police de caractères d'une vue complète (interface utilisateur d'activité). Notez que je travaille avec Mono (C #) mais que vous pouvez l’implémenter facilement avec Java.

Vous pouvez transmettre à cette classe une mise en page ou une vue spécifique que vous souhaitez personnaliser. Si vous voulez être super efficace, vous pouvez l'implémenter en utilisant le modèle Singleton.

public static class AndroidTypefaceUtility 
{
    static AndroidTypefaceUtility()
    {
    }
    //Refer to the code block beneath this one, to see how to create a typeface.
    public static void SetTypefaceOfView(View view, Typeface customTypeface)
    {
    if (customTypeface != null && view != null)
    {
            try
            {
                if (view is TextView)
                    (view as TextView).Typeface = customTypeface;
                else if (view is Button)
                    (view as Button).Typeface = customTypeface;
                else if (view is EditText)
                    (view as EditText).Typeface = customTypeface;
                else if (view is ViewGroup)
                    SetTypefaceOfViewGroup((view as ViewGroup), customTypeface);
                else
                    Console.Error.WriteLine("AndroidTypefaceUtility: {0} is type of {1} and does not have a typeface property", view.Id, typeof(View));
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine("AndroidTypefaceUtility threw:\n{0}\n{1}", ex.GetType(), ex.StackTrace);
                    throw ex;
                }
            }
            else
            {
                Console.Error.WriteLine("AndroidTypefaceUtility: customTypeface / view parameter should not be null");
            }
        }

        public static void SetTypefaceOfViewGroup(ViewGroup layout, Typeface customTypeface)
        {
            if (customTypeface != null && layout != null)
            {
                for (int i = 0; i < layout.ChildCount; i++)
                {
                    SetTypefaceOfView(layout.GetChildAt(i), customTypeface);
                }
            }
            else
            {
                Console.Error.WriteLine("AndroidTypefaceUtility: customTypeface / layout parameter should not be null");
            }
        }

    }

Dans votre activité, vous devrez créer un objet Typeface. Je crée le mien dans OnCreate () en utilisant un fichier .ttf placé dans mon répertoire Resources/Assets /. Assurez-vous que le fichier est marqué en tant qu'actif Android dans ses propriétés.

protected override void OnCreate(Bundle bundle)
{               
    ...
    LinearLayout rootLayout = (LinearLayout)FindViewById<LinearLayout>(Resource.Id.signInView_LinearLayout);
    Typeface allerTypeface = Typeface.CreateFromAsset(base.Assets,"Aller_Rg.ttf");
    AndroidTypefaceUtility.SetTypefaceOfViewGroup(rootLayout, allerTypeface);
}
3
JCKortlang

Prolonger la réponse d'Agarwal ... vous pouvez définir des styles normal, gras, italique, etc. en changeant le style de votre TextView.

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

public class TextViewAsap extends TextView {

    public TextViewAsap(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public TextViewAsap(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TextViewAsap(Context context) {
        super(context);
        init();
    }

    private void init() {
        if (!isInEditMode()) {
            Typeface tf = Typeface.DEFAULT;

            switch (getTypeface().getStyle()) {
                case Typeface.BOLD:
                    tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Bold.ttf");
                    break;

                case Typeface.ITALIC:
                    tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Italic.ttf");
                    break;

                case Typeface.BOLD_ITALIC:
                    tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Italic.ttf");
                    break;

                default:
                    tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Regular.ttf");
                    break;
            }

            setTypeface(tf);
        }
    }

}

Vous pouvez créer votre dossier Assets comme ceci:  Create Assets

Et votre dossier Assets devrait ressembler à ceci:

 enter image description here

Enfin, votre TextView au format XML devrait être une vue de type TextViewAsap. Maintenant, il peut utiliser n'importe quel style que vous avez codé ...

<com.example.project.TextViewAsap
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:text="Example Text"
                Android:textStyle="bold"/>
1
karenms

Meilleures réponses

1. Définition de la police personnalisée pour un textView

Typeface typeface = Typeface.createFromAsset(getContext().getAssets(), "Fonts/FontName.ttf");
textView.setTypeface (typeface);

2. Définition de la police personnalisée pour tous les textViews

Créez une classe Java comme ci-dessous

public class CustomFont extends Android.support.v7.widget.AppCompatTextView {

    public CustomFont(Context context) {
        super(context);
        init();
    }

    public CustomFont(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomFont(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
            Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/FontName.ttf");
            setTypeface(tf);
    }
}

Et dans votre page xml

<packageName.javaClassName>

...

/>

=>

    <com.mahdi.hossaini.app1.CustomFont
    Android:id="@+id/TextView1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:text="KEEP IT SIMPLE"
    Android:textAlignment="center" />
1
Mahdi Hossaini

Vous pouvez utiliser la bibliothèque Calligraphy qui est disponible ici:
Bibliothèque de calligraphie Android

0
Ayhan Salami

exemple de manière plus "générique" avec utilisation de la réflexion:

** il présente une idée de la méthode setTextSize (int, float) impliquant les enfants du groupe de vue, mais vous pouvez l'adopter comme dans le cas de votre question à setTypeFace ()

 /**
 * change text size of view group children for given class
 * @param v - view group ( for example Layout/widget)
 * @param clazz  - class to override ( for example EditText, TextView )
 * @param newSize - new font size
 */
public static void overrideTextSize(final View v, Class<?> clazz, float newSize) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideTextSize(child, clazz, newSize);
            }
        } else if (clazz.isAssignableFrom(v.getClass())) {
            /** create array for params */
            Class<?>[] paramTypes = new Class[2];
            /** set param array */
            paramTypes[0] = int.class;  // unit
            paramTypes[1] = float.class; // size
            /** get method for given name and parameters list */
            Method method = v.getClass().getMethod("setTextSize",paramTypes);
            /** create array for arguments */
            Object arglist[] = new Object[2];
            /** set arguments array */
            arglist[0] = TypedValue.COMPLEX_UNIT_SP;
            arglist[1] = newSize;
            /** invoke method with arguments */
            method.invoke(v,arglist);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

MISE EN GARDE:

utiliser la réflexion doit être très prudent. Classe de réflexion c'est très " exceptionnel "

  • par exemple, vous devez vérifier la présence d'annotations pour éviter différents types de problèmes. Dans le cas de la méthode SetTextSize (), il est souhaitable de vérifier les annotations Android.view.RemotableViewMethod
0
ceph3us