Ich habe meinem Ordner "Assets / Fonts" eine benutzerdefinierte Schriftartdatei hinzugefügt. Wie verwende ich es aus meinem XML?
Ich kann es aus dem Code wie folgt verwenden:
TextView text = (TextView) findViewById(R.id.textview03);
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf");
text.setTypeface(tf);
Kann ich es nicht mit einem android:typeface="/fonts/Molot.otf"
Attribut aus XML machen ?
Antworten:
Kurze Antwort: Nein. Android bietet keine integrierte Unterstützung für das Anwenden benutzerdefinierter Schriftarten auf Text-Widgets über XML.
Es gibt jedoch eine Problemumgehung, die nicht besonders schwer zu implementieren ist.
Zuerst
Sie müssen Ihr eigenes Stylable definieren. Öffnen / erstellen Sie in Ihrem Ordner / res / values die Datei attrs.xml und fügen Sie ein deklarierbares Objekt wie folgt hinzu:
Zweite
Angenommen, Sie möchten dieses Widget häufig verwenden, sollten Sie einen einfachen Cache für die geladenen
Typeface
Objekte einrichten , da das Laden aus dem Speicher im laufenden Betrieb einige Zeit in Anspruch nehmen kann. Etwas wie:In diesem Fall können Sie .ttc-Dateierweiterungen verwenden, diese sind jedoch nicht getestet.
Dritte
Erstellen Sie eine neue Klasse, die Unterklassen enthält
TextView
. Dieses spezielle Beispiel berücksichtigt die definierte XML - Schrift (bold
,italic
usw.) und es auf die Schriftart (vorausgesetzt , Sie eine .ttc Datei verwenden).Schließlich
Ersetzen Sie die Instanzen
TextView
in Ihrem XML durch den vollständig qualifizierten Klassennamen. Deklarieren Sie Ihren benutzerdefinierten Namespace wie den Android-Namespace. Beachten Sie, dass das "typefaceAsset" auf eine .ttf- oder .ttc-Datei verweisen sollte, die in Ihrem Verzeichnis / assets enthalten ist.quelle
Hier ist ein Beispielcode, der dies tut. Ich habe die Schriftart in einer statischen endgültigen Variablen definiert und die Schriftartdatei befindet sich im Assets-Verzeichnis.
quelle
Erstellen Sie Ihre benutzerdefinierte Textansicht, die zu der Schriftart gehört, die Sie verwenden möchten. In dieser Klasse verwende ich ein statisches mTypeface-Feld, um die Schrift zwischenzuspeichern (für eine bessere Leistung).
In der XML-Datei:
In der Java-Klasse:
quelle
Die Aktivität implementiert LayoutInflater.Factory2, das Rückrufe für jede erstellte Ansicht bereitstellt. Es ist möglich, die Textansicht mit dem Attribut "Benutzerdefinierte Schriftfamilie" zu formatieren, die Schriftarten bei Bedarf zu laden und "setTypeface" für instanziierte Textansichten automatisch aufzurufen.
Aufgrund der architektonischen Beziehung von Inflater-Instanzen zu Aktivitäten und Windows besteht der einfachste Ansatz zur Verwendung benutzerdefinierter Schriftarten in Android darin, geladene Schriftarten auf Anwendungsebene zwischenzuspeichern.
Die Beispielcodebasis ist hier:
https://github.com/leok7v/android-textview-custom-fonts
führt zu
quelle
Aufgrund dieser Tatsache ist es keine gute Idee, benutzerdefinierte Schriftarten in XML zu verwenden. Das heißt, Sie müssen dies programmgesteuert tun, um Speicherverluste zu vermeiden!
quelle
Vielleicht können Sie Reflection verwenden, um Ihre Schriftart in die statische Liste der verfügbaren Schriftarten einzufügen / zu hacken, wenn Ihre Anwendung erstellt wird? Ich bin an Rückmeldungen von anderen interessiert, wenn dies eine wirklich, wirklich schlechte Idee ist oder wenn dies eine großartige Lösung ist - es scheint, dass es eines dieser Extreme sein wird ...
Ich konnte meine benutzerdefinierte Schriftart mit meinem eigenen Schriftfamiliennamen in die Liste der Systemschriftarten einfügen und dann diesen benutzerdefinierten Schriftfamiliennamen ("Pinsel-Skript") als Wert für android: FontFamily in einer Standard-Textansicht angeben, die auf meinem LG funktioniert G4 mit Android 6.0.
In meinem Layout
quelle
MyApplication
Klasse aufgerufen werden?und fügen Sie eine deklarierbare Datei in attrs.xml hinzu
und fügen Sie dann Ihren customFont like hinzu
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich habe eine viel einfachere Lösung gefunden.
Deklarieren Sie zuerst Ihre TextView wie gewohnt in XML. Legen Sie Ihre Schriftart (TTF oder TTC) im Asset-Ordner ab
Legen Sie dann einfach die Schriftart für Ihre Textansicht in Ihrer onCreate-Methode fest.
Getan.
quelle
Die beste Lösung besteht darin, (endlich) eine von Google eingeführte native benutzerdefinierte Schriftartfunktion in XML zu verwenden. Sie müssen jedoch auf API 26 abzielen. Es unterstützt API 16+
https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml
quelle
anstelle von xmlns: custom = "schemas.android.com/tools"; Sie sollten verwenden: xmlns: custom = "schemas.android.com/apk/res-auto"; um stilbare Attribute zu verwenden. Ich habe diese Änderung vorgenommen und sie funktioniert jetzt.
quelle