Ich möchte eine benutzerdefinierte Schriftart für meine Android-Anwendung verwenden, die ich erstelle.
Ich kann die Schriftart jedes Objekts von Code aus individuell ändern, aber ich habe Hunderte davon.
So,
- Gibt es eine Möglichkeit, dies aus dem XML heraus zu tun? [Festlegen einer benutzerdefinierten Schriftart]
- Gibt es eine Möglichkeit, dies aus Code an einer Stelle zu tun, um zu sagen, dass die gesamte Anwendung und alle Komponenten die benutzerdefinierte Schriftart anstelle der Standardschrift verwenden sollten?
Antworten:
Nein Entschuldigung. Sie können die integrierten Schriftarten nur über XML angeben.Nicht dass ich wüsste.Heutzutage gibt es dafür eine Vielzahl von Optionen:
Schriftressourcen und Backports im Android SDK, wenn Sie verwenden
appcompat
Bibliotheken von Drittanbietern für diejenigen, die sie nicht verwenden
appcompat
, obwohl nicht alle die Definition der Schriftart in Layoutressourcen unterstützenquelle
Ja, es ist möglich.
Sie müssen eine benutzerdefinierte Ansicht erstellen, die die Textansicht erweitert.
In
attrs.xml
imvalues
Ordner:In
main.xml
:In
MyTextView.java
:quelle
TextView
. Es sind benutzerdefinierte Unterklassen für jede Widget-Klasse erforderlich, die erbt, vonTextView
der dieselbe Funktion gewünscht wird.Ich habe dies auf eine "Brute Force" -Methode getan, die keine Änderungen an der Layout-XML oder den Aktivitäten erfordert.
Getestet auf Android Version 2.1 bis 4.4. Führen Sie dies beim Start der App in Ihrer Anwendungsklasse aus:
Ein vollständigeres Beispiel finden Sie unter http://github.com/perchrh/FontOverrideExample
quelle
code
<style name = "AppTheme" parent = "AppBaseTheme"> <item name = "android: typeface"> Monospace </ item> </ style> setzecode
, funktioniert es, aber nicht fett. Ich habe diesen Code in einer Klasse hinzugefügt, die Application erweitert. ist das der richtige Ort? @ P-ChanObwohl ich Manishs Antwort als die schnellste und zielgerichteteste Methode unterstütze, habe ich auch naive Lösungen gesehen, die nur rekursiv durch eine Ansichtshierarchie iterieren und die Schriften aller Elemente nacheinander aktualisieren. Etwas wie das:
Sie müssten diese Funktion in Ihren Ansichten sowohl nach dem Aufblasen des Layouts als auch in den
onContentChanged()
Methoden Ihrer Aktivität aufrufen .quelle
Ich konnte dies zentral tun, hier ist das Ergebnis:
Ich habe Folgendes
Activity
und ich erweitere es, wenn ich benutzerdefinierte Schriftarten benötige:Wenn ich jedoch eine Aktivität aus dem Support-Paket verwende, z. B.
FragmentActivity
dannActivity
:Ich habe diesen Code noch nicht mit
Fragment
s getestet , aber hoffentlich funktioniert es.Mein
FontUtils
ist einfach, wodurch auch das hier erwähnte Problem vor dem ICS gelöst wird : https://code.google.com/p/android/issues/detail?id=9904 :quelle
Hey, ich brauche auch 2 verschiedene Schriftarten in meiner App für verschiedene Widgeds! Ich benutze diesen Weg:
In meiner Anwendungsklasse erstelle ich eine statische Methode:
Die String-Schrift repräsentiert die Datei xyz.ttf im Asset-Ordner. (Ich habe eine Konstantenklasse erstellt.) Jetzt können Sie diese überall in Ihrer App verwenden:
Das einzige Problem ist, dass Sie dies für jedes Widget benötigen, in dem Sie die Schriftart verwenden möchten! Aber ich denke, das ist der beste Weg.
quelle
Mit dem Vorschlag von pospi und der Arbeit mit der Eigenschaft 'tag' wie Richard habe ich eine benutzerdefinierte Klasse erstellt, die meine benutzerdefinierten Schriftarten lädt und sie entsprechend ihren Tags auf die Ansichten anwendet.
Anstatt das TypeFace im Attribut android: fontFamily festzulegen, verwenden Sie das android: tag attritube und setzen es auf eine der definierten Aufzählungen.
In Ihrer Aktivität oder Ihrem Fragment rufen Sie einfach an
quelle
Ich habe im Blog von Lisa Wray eine schöne Lösung gefunden . Mit der neuen Datenbindung ist es möglich, die Schriftart in Ihren XML-Dateien festzulegen.
In XML:
quelle
Ich denke, es kann einen handlicheren Weg geben, dies zu tun. Die folgende Klasse legt eine benutzerdefinierte Schriftart für alle Komponenten Ihrer Anwendung fest (mit einer Einstellung pro Klasse).
quelle
Die Standardimplementierungen von LayoutInflater unterstützen die Angabe der Schriftart aus XML nicht. Ich habe es jedoch in XML gesehen, indem ich eine benutzerdefinierte Factory für den LayoutInflater bereitgestellt habe, die solche Attribute aus dem XML-Tag analysiert.
Die Grundstruktur würde dies mögen.
Dieser Artikel enthält eine ausführlichere Erläuterung dieser Mechanismen und wie der Autor versucht, auf diese Weise die Unterstützung des XML-Layouts für Schriftarten bereitzustellen. Den Code für die Implementierung des Autors finden Sie hier .
quelle
Festlegen einer benutzerdefinierten Schriftart auf einen regulären ProgressDialog / AlertDialog:
quelle
Ja, es ist möglich, indem die Standardschrift überschrieben wird. Ich folgte dieser Lösung und sie funktionierte mit einer einzigen Änderung wie ein Zauber für alle TextViews und ActionBar-Texte.
styles.xml
Anstelle von theme.xml, wie im obigen Link erwähnt, habe ich die Standardschriftart erwähnt, die in meiner styles.xml in meinem Standard-App-Theme-Tag überschrieben werden soll. Die Standardschriften, die überschrieben werden können, sind Serif, Sans, Monospace und Normal.
TypefaceUtil.java
Anfangs wusste ich nicht, dass die zu überschreibenden Schriftarten fest sind und definierte Werte enthalten, aber schließlich half es mir zu verstehen, wie Android mit Schriftarten und Schriftarten und ihren Standardwerten umgeht, was ein anderer Punkt ist.
quelle
Ich weiß nicht, ob es die gesamte App ändert, aber ich habe es geschafft, einige Komponenten zu ändern, die sonst nicht geändert werden könnten:
quelle
Ich mag Pospis Vorschlag. Warum nicht alles daran setzen? Verwenden Sie die Eigenschaft 'tag' einer Ansicht (die Sie in XML angeben können - 'android: tag'), um zusätzliche Stile anzugeben, die Sie in XML nicht ausführen können. Ich mag JSON, daher würde ich eine JSON-Zeichenfolge verwenden, um einen Schlüssel- / Wertesatz anzugeben. Diese Klasse erledigt die Arbeit - rufen
Style.setContentView(this, [resource id])
Sie einfach Ihre Aktivität an.Natürlich möchten Sie mehr als nur die Schrift verarbeiten, damit sich die Verwendung von JSON lohnt.
Ein Vorteil der Eigenschaft 'tag' besteht darin, dass Sie sie auf einen Basisstil festlegen können, den Sie als Thema verwenden, und sie somit automatisch auf alle Ihre Ansichten anwenden können. BEARBEITEN: Dies führt zu einem Absturz während des Aufblasens unter Android 4.0.3. Sie können einen Stil weiterhin verwenden und ihn einzeln auf Textansichten anwenden.
Eine Sache, die Sie im Code sehen werden - einige Ansichten haben ein Tag, ohne dass eines explizit festgelegt wurde - seltsamerweise ist es die Zeichenfolge 'Αποκοπή' - die laut Google Translate auf Griechisch 'geschnitten' ist! Was zum Teufel...?
quelle
Die Antwort von @ majinboo wurde hinsichtlich Leistung und Speicherverwaltung überarbeitet. Für mehr als eine Schriftart, die eine verwandte Aktivität benötigt, kann diese Schriftartklasse verwendet werden, indem der Konstruktor selbst als Parameter angegeben wird.
Die Klasse der überarbeiteten Schriftarten lautet wie folgt:
quelle
Arbeiten für Xamarin.Android:
Klasse:
Anwendungsimplementierung:
Stil:
quelle
Es sieht so aus, als ob die Verwendung von benutzerdefinierten Schriftarten mit Android O vereinfacht wurde. Sie können grundsätzlich XML verwenden, um dies zu erreichen. Ich habe einen Link zur offiziellen Dokumentation von Android als Referenz angehängt, und hoffentlich hilft dies Menschen, die diese Lösung noch benötigen. Arbeiten mit benutzerdefinierten Schriftarten in Android
quelle
Es kann nützlich sein zu wissen, dass Sie ab Android 8.0 (API-Level 26) können eine benutzerdefinierte Schriftart in XML verwenden können .
Einfach ausgedrückt, können Sie dies folgendermaßen tun.
Legen Sie die Schriftart in den Ordner
res/font
.Verwenden Sie es entweder im Attribut eines Widgets
<Button android:fontFamily="@font/myfont"/>
oder setzen Sie es in
res/values/styles.xml
und benutze es als Stil
quelle
Verwenden Sie das Attribut "fontPath" direkt in der XML-Datei.
zur Verwendung in style.xml
<item name = "fontPath"> fonts / ProximaNovaSemibold.ttf </ item>
zur Verwendung in direkten Layoutdateien
fontPath = "fonts / ProximaNovaBold.ttf"
(Hinweis: Das Präfix app / android muss nicht im Präfix verwendet werden.)
quelle
Absolut möglich. Viele Möglichkeiten, es zu tun. Am schnellsten erstellen Sie eine Bedingung mit der try-catch-Methode. Probieren Sie Ihre bestimmte Schriftstilbedingung aus, fangen Sie den Fehler ab und definieren Sie den anderen Schriftstil.
quelle