it-swarm.com.de

Schriftart für alle TextViews in der Aktivität festlegen?

Kann die Schriftart für alle TextViews in einer Aktivität festgelegt werden? Ich kann die Schriftart für eine einzelne Textansicht festlegen, indem Sie Folgendes verwenden: 

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

Aber ich möchte alle TextViews auf einmal ändern, anstatt sie manuell für jedes TextView einzustellen, würden wir uns über alle Informationen freuen!

51
William L.

Solution1 :: Rufen Sie diese Methode einfach auf, indem Sie die übergeordnete Ansicht als Argument übergeben.

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) {
 }
 }

Lösung2 :: Sie können die TextView-Klasse mit Ihrer benutzerdefinierten Schriftart unterteilen und sie anstelle von Textview verwenden.

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

Der aus meiner persönlichen Sammlung:

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

Wenn Sie nach einer allgemeineren programmatischen Lösung suchen, habe ich eine statische Klasse erstellt, mit der die Schriftart einer gesamten Ansicht (Aktivitätsbenutzeroberfläche) festgelegt werden kann. Beachten Sie, dass ich mit Mono (C #) arbeite. Sie können es jedoch leicht mit Java implementieren.

Sie können dieser Klasse ein Layout oder eine bestimmte Ansicht übergeben, die Sie anpassen möchten. Wenn Sie sehr effizient sein möchten, können Sie es mithilfe des Singleton-Musters implementieren.

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

    }

In Ihrer Aktivität müssen Sie ein Typeface-Objekt erstellen. Ich erstelle meine in OnCreate () mit einer .ttf-Datei, die sich in meinem Resources/Assets/-Verzeichnis befindet. Stellen Sie sicher, dass die Datei in ihren Eigenschaften als Android-Asset markiert ist.

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

Agarwals Antwort erweitern ... Sie können regulär, fett, kursiv usw. einstellen, indem Sie den Stil Ihres TextView ändern.

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

}

Sie können Ihren Assets-Ordner folgendermaßen erstellen:  Create Assets

Und Ihr Assets-Ordner sollte so aussehen:

 enter image description here

Schließlich sollte Ihre TextView in XML eine Ansicht des Typs TextViewAsap sein. Jetzt kann jeder Stil verwendet werden, den Sie codiert haben ...

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

Beste Antworten

1. Benutzerdefinierte Schriftart für eine Textansicht einstellen

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

2. Benutzerdefinierte Schriftart für alle TextViews festlegen

Erstellen Sie eine JavaClass wie unten

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

Und in deiner XML-Seite

<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

Sie können die hier verfügbare Calligraphy-Bibliothek verwenden:
Android-Kalligrafiebibliothek

0
Ayhan Salami

beispiel für einen "generischeren" Weg mit Reflexion:

** Es handelt sich um eine Idee, die viewgroup-Kindermethode setTextSize (int, float) einzubeziehen. Sie können sie jedoch wie bei Ihrer Frage in setTypeFace () übernehmen.

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

VORSICHT:

die Reflexion sollte sehr vorsichtig sein. Reflexionsklasse ist sehr " außergewöhnlich "

  • sie sollten beispielsweise prüfen, ob Anmerkungen vorhanden sind, um verschiedene Arten von Problemen zu vermeiden. Bei der Methode SetTextSize () ist es wünschenswert, die Anmerkungen Android.view.RemotableViewMethod zu überprüfen.
0
ceph3us