So legen Sie die Standardschriftfamilie für die gesamte Android App fest

Ich verwende die Roboto Light Schriftart in meiner App. Um die Schriftart einzustellen, muss ich die android:fontFamily="sans-serif-light" zu jeder Ansicht hinzufügen. Gibt es eine Möglichkeit, die Roboto-Schriftart als Standardschriftfamilie für die gesamte App zu deklarieren? Ich habe es versucht, aber es schien nicht zu funktionieren.

   sans-serif-light  

    Die Antwort ist ja.

    Globale Roboto-Light für TextView und Button classn:

        

    Wählen Sie einfach den gewünschten Stil aus der Liste themes.xml , und erstellen Sie dann Ihren benutzerdefinierten Stil basierend auf dem ursprünglichen Stil. Am Ende wenden Sie den Stil als das Thema der Anwendung an.

       

    Es funktioniert nur mit eingebauten Schriften wie Roboto, aber das war die Frage. Für benutzerdefinierte fonts (z. B. geladen von Assets) funktioniert diese Methode nicht.

    BEARBEITEN 08/13/15

    Wenn Sie AppCompat-Designs verwenden, denken Sie daran, das Präfix ” android: zu entfernen. Beispielsweise:

      

    Beachten Sie, dass der buttonStyle kein android: textViewStyle enthält, sondern textViewStyle enthalten muss.

    Mit der Veröffentlichung von Android Oreo können Sie die Support-Bibliothek verwenden, um dieses Ziel zu erreichen.

    1. Überprüfen Sie Ihre App build.gradle, wenn Sie die Support-Bibliothek > = 26.0.0 haben
    2. Fügen Sie den Ordner ” font ” zu Ihrem Ressourcenordner hinzu und fügen Sie dort Ihre fonts hinzu
    3. Verweisen Sie in Ihrem App-Hauptstil auf Ihre Standardschriftfamilie:

        

    Weitere Informationen finden Sie unter https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html .

    Sie können Kalligraphie für die Verwaltung von fonts mit Android verwenden

    https://github.com/chrisjenx/Calligraphy

    LESEN SIE UPDATES UNTEN

    Ich hatte das gleiche Problem mit der Einbettung einer neuen Schriftart und schließlich bekam es mit der Erweiterung der TextView arbeiten und legen Sie die Typefont in.

     public class YourTextView extends TextView { public YourTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public YourTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public YourTextView(Context context) { super(context); init(); } private void init() { Typeface tf = Typeface.createFromAsset(context.getAssets(), "fonts/helveticaneue.ttf"); setTypeface(tf); } } 

    Sie müssen die TextView-Elemente später von in auf jedes Element ändern. Und wenn Sie den UI-Creator in Eclipse verwenden, zeigt er manchmal die TextViews nicht richtig an. War das einzige was für mich funktioniert …

    AKTUALISIEREN

    Heutzutage benutze ich Reflektion, um Schriften in der gesamten Anwendung zu ändern, ohne TextViews zu erweitern. Sieh dir diesen SO Post an

    UPDATE 2

    Beginnend mit API Level 26 und verfügbar in “Support-Bibliothek”, die Sie verwenden können

     android:fontFamily="@font/embeddedfont" 

    Weitere Informationen: Schriften in XML

    Sprechen Sie nicht über die performance, für benutzerdefinierte fonts können Sie eine rekursive Methode verwenden, um alle Ansichten zu durchlaufen und fonts festzulegen, wenn es sich um TextView handelt:

     public class Font { public static void setAllTextView(ViewGroup parent) { for (int i = parent.getChildCount() - 1; i >= 0; i--) { final View child = parent.getChildAt(i); if (child instanceof ViewGroup) { setAllTextView((ViewGroup) child); } else if (child instanceof TextView) { ((TextView) child).setTypeface(getFont()); } } } public static Typeface getFont() { return Typeface.createFromAsset(YourApplicationContext.getInstance().getAssets(), "fonts/whateverfont.ttf"); } } 

    Übergeben Sie in Ihrer gesamten Aktivität die aktuelle ViewGroup nach setContentView und es ist fertig:

     ViewGroup group = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content); Font.setAllTextView(group); 

    Für Fragment können Sie etwas Ähnliches tun.

    Eine andere Möglichkeit, dies für die gesamte App zu tun, ist die Verwendung von Reflektion basierend auf dieser Antwort

     public class TypefaceUtil { /** * Using reflection to override default typefaces * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE * OVERRIDDEN * * @param typefaces map of fonts to replace */ public static void overrideFonts(Map typefaces) { try { final Field field = Typeface.class.getDeclaredField("sSystemFontMap"); field.setAccessible(true); Map oldFonts = (Map) field.get(null); if (oldFonts != null) { oldFonts.putAll(typefaces); } else { oldFonts = typefaces; } field.set(null, oldFonts); field.setAccessible(false); } catch (Exception e) { Log.e("TypefaceUtil", "Can not set custom fonts"); } } public static Typeface getTypeface(int fontType, Context context) { // here you can load the Typeface from asset or use default ones switch (fontType) { case BOLD: return Typeface.create(SANS_SERIF, Typeface.BOLD); case ITALIC: return Typeface.create(SANS_SERIF, Typeface.ITALIC); case BOLD_ITALIC: return Typeface.create(SANS_SERIF, Typeface.BOLD_ITALIC); case LIGHT: return Typeface.create(SANS_SERIF_LIGHT, Typeface.NORMAL); case CONDENSED: return Typeface.create(SANS_SERIF_CONDENSED, Typeface.NORMAL); case THIN: return Typeface.create(SANS_SERIF_MEDIUM, Typeface.NORMAL); case MEDIUM: return Typeface.create(SANS_SERIF_THIN, Typeface.NORMAL); case REGULAR: default: return Typeface.create(SANS_SERIF, Typeface.NORMAL); } } } 

    Wenn Sie die fonts überschreiben möchten, können Sie einfach die Methode aufrufen und ihr wie folgt eine Schriftart zuordnen:

     Typeface regular = TypefaceUtil.getTypeface(REGULAR, context); Typeface light = TypefaceUtil.getTypeface(REGULAR, context); Typeface condensed = TypefaceUtil.getTypeface(CONDENSED, context); Typeface thin = TypefaceUtil.getTypeface(THIN, context); Typeface medium = TypefaceUtil.getTypeface(MEDIUM, context); Map fonts = new HashMap<>(); fonts.put("sans-serif", regular); fonts.put("sans-serif-light", light); fonts.put("sans-serif-condensed", condensed); fonts.put("sans-serif-thin", thin); fonts.put("sans-serif-medium", medium); TypefaceUtil.overrideFonts(fonts); 

    für die vollständige Beispielprüfung

    Dies funktioniert nur für Android SDK 21 und höher für frühere Versionen. Überprüfen Sie das vollständige Beispiel

    Verwenden Sie einfach diese Lib kompilieren Sie es in Ihrer Notendatei

     complie'me.anwarshahriar:calligrapher:1.0' 

    und verwende es in der onCreate-Methode in der Hauptaktivität

     Calligrapher calligrapher = new Calligrapher(this); calligrapher.setFont(this, "yourCustomFontHere.ttf", true); 

    Dies ist der eleganteste und schnellste Weg, dies zu tun.

    Android bietet nicht viel Unterstützung für das Anwenden von Zeichensätzen auf die gesamte App (siehe dieses Problem ). Sie haben 4 Optionen, um die Schriftart für die gesamte App festzulegen:

    • Option1: Wenden Sie die Reflektion an, um die Systemschriftart zu ändern
    • Option2: Erstellen und Unterklasse für benutzerdefinierte Ansichtsklassen für jede Ansicht, die eine benutzerdefinierte Schriftart benötigt
    • Option 3: Implementieren Sie einen Ansichts-Crawler, der die Ansichtshierarchie für den aktuellen Bildschirm durchläuft
    • Option4: Verwenden Sie eine Bibliothek von Drittanbietern.

    Details zu diesen Optionen finden Sie hier .

    Ich weiß, dass diese Frage ziemlich alt ist, aber ich habe eine gute Lösung gefunden. Grundsätzlich übergeben Sie ein Container-Layout an diese function, und es wendet die Schriftart auf alle unterstützten Ansichten und rekursiv in untergeordneten Layouts an:

     public static void setFont(ViewGroup layout) { final int childcount = layout.getChildCount(); for (int i = 0; i < childcount; i++) { // Get the view View v = layout.getChildAt(i); // Apply the font to a possible TextView try { ((TextView) v).setTypeface(MY_CUSTOM_FONT); continue; } catch (Exception e) { } // Apply the font to a possible EditText try { ((TextView) v).setTypeface(MY_CUSTOM_FONT); continue; } catch (Exception e) { } // Recursively cicle into a possible child layout try { ViewGroup vg = (ViewGroup) v; Utility.setFont(vg); continue; } catch (Exception e) { } } } 

    Um die Schriftart der App auf normal , sans , serif oder monospace (nicht auf eine benutzerdefinierte Schriftart!) zu setzen, können Sie dies tun.

    Definieren Sie ein styles.xml und setzen Sie das Attribut android:typeface styles.xml auf die Schriftart, die Sie in styles.xml verwenden styles.xml :

         

    AndroidManifest.xml das AndroidManifest.xml auf die gesamte App in der Datei AndroidManifest.xml :

     < ?xml version="1.0" encoding="utf-8"?>     

    Android-Referenz

    Probieren Sie diese Bibliothek aus, die leicht und einfach zu implementieren ist

    https://github.com/sunnag7/FontStyler

      

    Die Antwort ist nein, du kannst nicht. Siehe Ist es möglich, eine benutzerdefinierte Schriftart für die gesamte Anwendung festzulegen? für mehr Informationen.

    Es gibt Workarounds, aber nichts in den Zeilen von “einer einzigen Codezeile hier und alle meine Fonts werden das anstelle davon sein “.

    (Ich danke Google – und Apple – dafür). Benutzerdefinierte Fonts haben einen Platz, aber sie lassen sich leicht durch App-Wide ersetzen. Dies hätte eine ganze Welt von Comic Sans- Anwendungen geschaffen.