Benutzerdefinierte Schriftarten und XML-Layouts (Android)

Lesezeit: 10 Minuten

Ich versuche, ein GUI-Layout mit XML-Dateien in Android zu definieren. Soweit ich das herausfinden kann, gibt es keine Möglichkeit festzulegen, dass Ihre Widgets eine benutzerdefinierte Schriftart (z. B. eine, die Sie in assets/font/ platziert haben) in XML-Dateien verwenden sollen, und Sie können nur die vom System installierten Schriftarten verwenden.

Ich weiß, dass ich im Java-Code die Schriftart jedes Widgets manuell ändern könnte, indem ich eindeutige IDs verwende. Alternativ könnte ich alle Widgets in Java durchlaufen, um diese Änderung vorzunehmen, aber das wäre wahrscheinlich sehr langsam.

Welche anderen Möglichkeiten habe ich? Gibt es bessere Möglichkeiten, Widgets mit einem benutzerdefinierten Aussehen zu erstellen? Ich möchte nicht unbedingt die Schriftart für jedes neue Widget, das ich hinzufüge, manuell ändern müssen.

  • DrDefrost – bitte akzeptieren Sie einige Antworten, Sie erhalten weitere Antworten auf dieser Seite.

    – SK9

    3. September 2011 um 1:52 Uhr

  • Hier ist eine weitere ähnliche Frage: stackoverflow.com/questions/9030204/…

    – Weine

    16. Mai 2013 um 13:12 Uhr

  • Aktualisiert 05/2017: „Die Support-Bibliothek 26.0 Beta bietet Unterstützung für die Funktion „Schriftarten in XML“ auf Geräten mit Android-API-Version 14 und höher.“ Sehen: developer.android.com/preview/features/…

    – Albert C. Braun

    23. Mai 2017 um 14:12 Uhr

Benutzerdefinierte Schriftarten und XML Layouts Android
Peter

Sie können TextView erweitern, um benutzerdefinierte Schriftarten festzulegen, wie ich gelernt habe Hier.

TextViewPlus.java:

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }

}

attrs.xml: (in Auflösung/Werten)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TextViewPlus">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="saxmono.ttf">
    </com.example.TextViewPlus>
</LinearLayout>

Sie würden “saxmono.ttf” in die einfügen Vermögenswerte Mappe.

UPDATE 01.08.13

Bei dieser Methode gibt es ernsthafte Speicherprobleme. Siehe den Kommentar von Chedabo unten.

  • Das sieht gut aus, aber ich erhalte eine Fehlermeldung, wenn ich versuche, “TextViewPlus” in der main.xml zu verwenden. Ich erhalte Folgendes: – Fehler: Fehler beim Analysieren von XML: ungebundenes Präfix – Das Präfix “foo” für das Attribut “foo:customFont”, das einem Elementtyp “supportLibs.TextViewPlus” zugeordnet ist, ist nicht gebunden.

    – Majjoodi

    17. November 2011 um 15:11 Uhr


  • Beachten Sie, dass dadurch Dutzende von TypeFace-Objekten generiert werden und Speicherplatz verbraucht wird. Es gibt einen Fehler in Android vor Version 4.0, der TypeFaces nicht richtig freigibt. Am einfachsten ist es, einen TypeFace-Cache mit einer HashMap zu erstellen. Dadurch wurde die Speichernutzung in meiner App von über 120 MB auf 18 MB gesenkt. code.google.com/p/android/issues/detail?id=9904

    – Chedabo

    24. Januar 2012 um 14:20 Uhr


  • @Majjoodi: Das passiert normalerweise, wenn Sie vergessen, den zweiten Namespace zu Ihrem Layout hinzuzufügen: xmlns:foo="http://schemas.android.com/apk/res/com.example

    – Das Ö

    24. März 2012 um 2:56 Uhr

  • SEHR WICHTIG – Ich möchte den Rat von Chedabo nur doppelt betonen. Wenn Sie es nicht befolgen, werden Sie in Pre-ICS ein Speicherleck haben. Es gibt nur wenige Lösungen, eine davon befindet sich in dem von chedabob bereitgestellten Link, eine andere ist hier: stackoverflow.com/questions/8057010/listview-memory-leak. peter – bitte aktualisieren Sie Ihre Antwort – es ist großartig, aber nicht vollständig

    – Michal Klimczak

    12. August 2012 um 18:43 Uhr


  • Wie setze ich dieses benutzerdefinierte Attribut in styles.xml zusätzlich zu anderen Textview-Attributen wie Breite und Höhe?

    – löschg

    7. November 2012 um 22:56 Uhr

Ich bin 3 Jahre zu spät für die Party 🙁 Dies könnte jedoch für jemanden nützlich sein, der über diesen Beitrag stolpern könnte.

Ich habe eine Bibliothek geschrieben, die Schriftarten zwischenspeichert und es Ihnen auch ermöglicht, benutzerdefinierte Schriftarten direkt aus XML anzugeben. Sie finden die Bibliothek Hier.

So würde Ihr XML-Layout aussehen, wenn Sie es verwenden.

<com.mobsandgeeks.ui.TypefaceTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    geekui:customTypeface="fonts/custom_font.ttf" />

  • Hey @Ragunath-jawahar, wie würde ich die Bibliothek für ein Gradle-Projekt importieren? Ich habe es versucht compile 'com.mobsandgeeks:android-typeface-textview:1.0' aber das hat nicht funktioniert.

    – aimango

    14. Juni 2014 um 23:21 Uhr


  • Sie benötigen ein AAR, um es auf diese Weise verwenden zu können. Es ist noch nicht da. Sie können die Quellen kopieren und vorerst ein Android Studio Library-Projekt erstellen.

    – Ragunath Jawahar

    17. Juni 2014 um 15:21 Uhr

  • Woher kommt dein Geekui-Tag?

    – sefirosu

    14. Juli 2014 um 12:37 Uhr

  • Aus dem im übergeordneten Tag angegebenen Namespace – xmlns:geekui="http://schemas.android.com/apk/res-auto"

    – Ragunath Jawahar

    15. Juli 2014 um 10:20 Uhr


  • @MuhammedRefaat, ja das tut es 🙂

    – Ragunath Jawahar

    23. Januar 2015 um 23:50 Uhr

Benutzerdefinierte Schriftarten und XML Layouts Android
Leonardo Cardoso

Dies ist möglicherweise etwas spät, aber Sie müssen eine Singleton-Klasse erstellen, die die benutzerdefinierte Schriftart zurückgibt, um Speicherverluste zu vermeiden.

TypeFace-Klasse:

public class OpenSans {

private static OpenSans instance;
private static Typeface typeface;

public static OpenSans getInstance(Context context) {
    synchronized (OpenSans.class) {
        if (instance == null) {
            instance = new OpenSans();
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), "open_sans.ttf");
        }
        return instance;
    }
}

public Typeface getTypeFace() {
    return typeface;
}
}

Benutzerdefinierte Textansicht:

public class NativelyCustomTextView extends TextView {

    public NativelyCustomTextView(Context context) {
        super(context);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

}

Per xml:

<com.yourpackage.views.NativelyCustomTextView
            android:id="@+id/natively_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_margin="20dp"
            android:text="@string/natively"
            android:textSize="30sp" /> 

Programmatisch:

TextView programmaticallyTextView = (TextView) 
       findViewById(R.id.programmatically_text_view);

programmaticallyTextView.setTypeface(OpenSans.getInstance(this)
                .getTypeFace());

  • Scheint zur Laufzeit zu funktionieren, aber soll es auch im Designer funktionieren?

    – Magnus Johansson

    5. Mai 2013 um 13:50 Uhr

  • Sicher. Sie können als xml verwenden. @Magnus

    – Leonardo Cardoso

    5. Mai 2013 um 22:32 Uhr

  • Ich glaube, du hast es falsch verstanden, es scheint nicht zu funktionieren Design Zeit (Designer-Vorschau). (xml != Designer). Es funktioniert gut, angegeben in der XML-Layoutdatei, die zur Laufzeit kompiliert wurde. Jedenfalls verwende ich diese Erweiterung github.com/danh32/Fontifywas für meine Bedürfnisse viel besser funktioniert (es unterstützt mehrere Schriftstile, normal, fett usw. sowie verschiedene Schriftnamen sowie andere Steuerelemente über TextView hinaus).

    – Magnus Johansson

    6. Mai 2013 um 11:25 Uhr


  • Das getTypeFace erstellt bei jedem Aufruf eine neue Schriftart … dies macht den Zweck des Singletons zunichte. Es sollte über ein statisches Feld verfügen, das beim ersten Aufruf festgelegt wird und bei nachfolgenden Aufrufen den Wert des Felds zurückgibt.

    – Steven Pena

    2. August 2014 um 12:46 Uhr

  • @chiwai du hast recht! Über die erste Frage braucht es nicht. Bei der zweiten war es ein Tippfehler.

    – Leonardo Cardoso

    20. November 2014 um 22:24 Uhr

Alte Frage, aber ich wünschte, ich hätte diese Antwort hier gelesen, bevor ich meine eigene Suche nach einer guten Lösung begonnen habe. Kalligraphie erweitert die android:fontFamily -Attribut, um Unterstützung für benutzerdefinierte Schriftarten in Ihrem Asset-Ordner hinzuzufügen, etwa so:

<TextView 
  android:text="@string/hello_world"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:fontFamily="fonts/Roboto-Bold.ttf"/>

Das Einzige, was Sie tun müssen, um es zu aktivieren, ist, es an den Kontext der von Ihnen verwendeten Aktivität anzuhängen:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}

Sie können auch Ihr eigenes benutzerdefiniertes Attribut zum Ersetzen angeben android:fontFamily

Es funktioniert auch in Themen, einschließlich des AppTheme.

Verwenden Datenbindung :

@BindingAdapter({"bind:font"})
public static void setFont(TextView textView, String fontName){
 textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
}

Im XML-Format:

<TextView
app:font="@{`Source-Sans-Pro-Regular.ttf`}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

Schriftartdatei muss enthalten sein assets/fonts/

1646256429 816 Benutzerdefinierte Schriftarten und XML Layouts Android
Tore Rudberg

Wenn Sie nur eine Schriftart hinzufügen möchten und weniger Code schreiben möchten, können Sie eine dedizierte TextView für Ihre spezifische Schriftart erstellen. Siehe Code unten.

package com.yourpackage;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {
    public static Typeface FONT_NAME;


    public FontTextView(Context context) {
        super(context);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
}

In der main.xml können Sie nun Ihre textView wie folgt hinzufügen:

<com.yourpackage.FontTextView
    android:id="@+id/tvTimer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="" />

1646256429 825 Benutzerdefinierte Schriftarten und XML Layouts Android
jeevan s

Der beste Weg, dies von der Vorschauversion von Android O aus zu tun, ist dieser Weg

1.)Klicken Sie mit der rechten Maustaste auf die res-Ordner und gehe zu Neu > Android-Ressourcenverzeichnis. Das neue
Das Fenster „Ressourcenverzeichnis“ wird angezeigt.
2.)Wählen Sie in der Liste Ressourcentyp aus Schriftartund klicken Sie dann auf OK.
3.)Fügen Sie Ihre Schriftdateien im Schriftordner hinzu.Die folgende Ordnerstruktur generiert R.font.dancing_script, R.font.la_la und R.font.ba_ba.
4.)Doppelklick eine Schriftdatei, um eine Vorschau der Schriften der Datei im Editor anzuzeigen.

Als nächstes müssen wir eine Schriftfamilie erstellen

1.) Klicken Sie mit der rechten Maustaste auf den Schriftartenordner und gehen Sie zu Neu > Font-Ressourcendatei. Das Fenster Neue Ressourcendatei wird angezeigt.
2.) Geben Sie die ein Dateinamen, und klicken Sie dann auf OK. Die XML-Datei der neuen Schriftartressource wird im Editor geöffnet.
3.) Schließen Sie alle Schriftdatei-, Stil- und Gewichtsattribute in das Schrift-Tag-Element ein. Das folgende XML veranschaulicht das Hinzufügen von schriftartbezogenen Attributen in der Schriftartressourcen-XML:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
    android:fontStyle="normal"
    android:fontWeight="400"
    android:font="@font/hey_regular" />
    <font
    android:fontStyle="italic"
    android:fontWeight="400"
    android:font="@font/hey_bababa" />
</font-family>

Hinzufügen von Schriftarten zu einer TextView:

   <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    **android:fontFamily="@font/ba_ba"**/>

Wie aus der Dokumentation

Arbeiten mit Schriftarten

alle schritte sind richtig.

  • Die beste Antwort! Der Dateiname der Schriftart muss in Kleinbuchstaben sein.

    – Dmitri

    26. August 2018 um 6:15 Uhr

  • Sie können auch einen benutzerdefinierten Stil erstellen, den Sie auf Ihre Anwendung anwenden (unter der AndroidManifest-Datei), und er wird ALLEN Ansichten zugewiesen. Anstatt es zum Beispiel nur auf einer einzelnen TextView zu platzieren, da dies die Toolbar nicht beeinflusst.

    – goldenmaza

    27. Januar 2019 um 0:31 Uhr

916290cookie-checkBenutzerdefinierte Schriftarten und XML-Layouts (Android)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy