2013-08-21 19 views
6

Gibt es eine einfache Möglichkeit, alle Textansichten (und alle anderen Textelemente in meiner App) eine eigene Schriftart (und nicht die integrierten Auswahlmöglichkeiten) zu verwenden, ohne manuell zu müssen setze sie über textview.setTypeface()?Benutzerdefinierte Schriftart für alle TextViews

Ich denke, die Erweiterung von Textview würde den Trick machen, aber dann die Schnittstellen mit dem visuellen Editor zu bauen, ist irgendwie ein Schmerz. Ich dachte an etwas wie Styling, aber ich finde nicht, wie man dort eine benutzerdefinierte Schriftart setzt.

+0

Aktivieren Sie diese bitte http://stackoverflow.com/questions/6926263/add-custom-font-for -complete-android-application und http://stackoverflow.com/questions/9327053/using-custom-font-in-android-textview-using-xml –

+0

Hi @MichelReap kannst du bitte meine Antwort als akzeptiert markieren, wenn sie gelöst ist Ihr Problem ... –

Antwort

12

Wenn Sie eine Schriftart für alle TextViews in Android-Anwendung festlegen müssen, können Sie diese Lösung verwenden. Es überschreibt ALLE TextView-Schriftarten, enthält eine Aktionsleiste und andere Standardkomponenten, aber die Passwortschriftart von EditText wird nicht überschrieben.

MyApp.java

public class MyApp extends Application { 

    @Override 
    public void onCreate() 
    { 
       TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf"); 
    } 
    } 

TypefaceUtil.java

 public class TypefaceUtil { 

/** 
* Using reflection to override default typeface 
* NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN 
* @param context to work with assets 
* @param defaultFontNameToOverride for example "monospace" 
* @param customFontFileNameInAssets file name of the font from assets 
*/ 
public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) { 
    try { 
     final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets); 

     final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride); 
     defaultFontTypefaceField.setAccessible(true); 
     defaultFontTypefaceField.set(null, customFontTypeface); 
    } catch (Exception e) { 
     Log.e("TypefaceUtil","Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride); 
    } 
} 

}

themes.xml

 <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
    <style name="MyAppTheme" parent="@android:style/Theme.Holo.Light"> 
    <!-- you should set typeface which you want to override with TypefaceUtil --> 
    <item name="android:typeface">serif</item> 
    </style> 
    </resources> 

Update für Android 5.0 oder höher

Wie ich untersucht und getestet auf dem Gerät läuft api 5.0 oder höher diese Lösung funktioniert gut, weil ich die einzige style.xml Datei verwende und nicht andere style.xml machen in Werte-21 Ordner

Obwohl Einige Benutzer fragen mich, dass diese Lösung nicht mit Android 5.0-Gerät funktioniert (sie verwenden Werte-21 style.xml ich denke)

Also das ist, weil unter API 21 die meisten der Texte Stile fontFamily Einstellung, wie

<item name="fontFamily">@string/font_family_body_1_material</item> 

, die den Standard-Roboto Regular applys:

<string name="font_family_body_1_material">sans-serif</string> 

So ist die beste Lösung ist

Wenn einer mit Problem nicht für 5.0+ arbeiten. Überschreiben Sie die Schriftart in Ihren v21-Werten nicht.

Überschreibe einfach die Schriftart in Werten/Stil.xml und Sie werden gut zu gehen :)

+2

funktioniert perfekt, sollte dies angenommen werden Antwort – Lokesh

+1

Funktioniert gut auf vielen Geräten. Aber ich versuche auf einigen Geräten wie einem Samsung S5 (5.0.1) und es funktioniert nicht. –

+0

@ErPragatiSingh es funktioniert nur gut lassen Sie mich wissen, wenn Sie ein Problem haben .. –

1

Sie können eine Methode erstellen, um Schriftart für eine Textansicht in einer allgemeinen Klasse festzulegen, und Sie können den Aufruf dieser Methode festlegen und die Textansicht als ihr Attribut senden.

0

Ja. Erstellen Sie einfach einen Stil und legen Sie ihn auf eine bestimmte Schriftart fest, und legen Sie dann die gesamte App in diesem Stil fest.

0

Sie können dies tun, indem Sie eine Unterklasse von TextView erstellen und die setTypeFace-Methode darin aufrufen. Zum Beispiel im Konstruktor.

0

ein Verfahren in Constants Klasse machen, so dass sie von allen Fragmenten und Aktivitäten zugegriffen werden kann:

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(Typeface.createFromAsset(context.getAssets(), "font/Lato-Regular.ttf")); 
     } else if (v instanceof EditText) { 
      ((EditText) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "font/Lato-Regular.ttf")); 
     } else if (v instanceof Button) { 
      ((Button) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "font/Lato-Regular.ttf")); 
     } 
    } catch (Exception e) { 
    } 
} 

Call-Methode zur Ausübung der Tätigkeit:

Constants.overrideFonts(MainActivity.this, getWindow().getDecorView().getRootView()); 

Call-Methode in Fragmente als:

Constants.overrideFonts(getActivity(), view); 
Verwandte Themen