Frage 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 hinzufügen android:fontFamily="sans-serif-light" zu jeder Aussicht. 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.

<style name="AppBaseTheme" parent="android:Theme.Light"></style>

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

187
2018-05-06 18:24


Ursprung


Antworten:


Die Antwort ist ja.

Globales Roboto-Licht für TextView und Button Klassen:

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="android:buttonStyle">@style/RobotoButtonStyle</item>
</style>

<style name="RobotoTextViewStyle" parent="android:Widget.TextView">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

<style name="RobotoButtonStyle" parent="android:Widget.Holo.Button">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

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

<application
    android:theme="@style/AppTheme" >
</application>

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

BEARBEITEN 08/13/15

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

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="buttonStyle">@style/RobotoButtonStyle</item>
</style>

Beachten Sie das buttonStyle enthält nicht android: Präfix, aber textViewStyle muss es enthalten.


221
2018-05-06 20:55



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

  1. Checke deine App ein build.gradle wenn Sie die Support-Bibliothek haben > = 26.0.0
  2. Hinzufügen "Schriftart"Ordner zu Ihrem Ressourcenordner und fügen Sie dort Ihre Schriften hinzu
  3. Verweisen Sie in Ihrem App-Hauptstil auf Ihre Standardschriftfamilie:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
       <item name="android:fontFamily">@font/your_font</item>
       <item name="fontFamily">@font/your_font</item> <!-- target android sdk versions < 26 and > 14 if theme other than AppCompat -->
    </style>
    

Prüfen https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html für detailliertere Informationen.


58
2017-08-31 10:08



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

https://github.com/chrisjenx/Calligraphy


42
2018-05-27 10:06



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: Schriftarten in XML


29
2018-05-06 20:14



Sprechen Sie nicht über die Leistung, für benutzerdefinierte Schriftarten können Sie eine rekursive Methode verwenden, um alle Ansichten zu durchlaufen und Schriftarten 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.


6
2018-04-25 10:19



Eine andere Möglichkeit, dies für die gesamte App zu tun, ist eine darauf basierende Reflektion Antworten 

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<String, Typeface> typefaces) {
        try {
            final Field field = Typeface.class.getDeclaredField("sSystemFontMap");
            field.setAccessible(true);
            Map<String, Typeface> oldFonts = (Map<String, Typeface>) 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 Schriftarten ü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<String, Typeface> 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 ein vollständiges Beispiel prüfen 

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


3
2017-10-20 12:00



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.


1
2017-08-24 03:15



Android bietet nicht viel Unterstützung für das Anwenden von Zeichensätzen auf die gesamte App (siehe hierzu auch die Informationen zu diesem Thema) 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
  • Option3: Implementieren Sie einen Ansichts-Crawler, der die Ansicht durchläuft Hierarchie für den aktuellen Bildschirm
  • Option4: Verwenden Sie eine Bibliothek von Drittanbietern.

Details dieser Optionen können gefunden werden Hier.


0
2018-03-24 17:26