Ich muss für meine gesamte Anwendung eine bestimmte Schriftart verwenden. Ich habe eine .ttf-Datei für das gleiche. Ist es möglich, diese beim Start der Anwendung als Standardschriftart festzulegen und sie dann an einer anderen Stelle in der Anwendung zu verwenden? Wie verwende ich es in meinen Layout-XMLs, wenn es festgelegt ist?
java
android
android-fonts
Samuh
quelle
quelle
Antworten:
Ja mit Nachdenken. Dies funktioniert ( basierend auf dieser Antwort ):
(Hinweis: Dies ist eine Problemumgehung, da benutzerdefinierte Schriftarten nicht unterstützt werden. Wenn Sie diese Situation ändern möchten, stimmen Sie bitte ab, um das Android-Problem hier zu verbessern .) Hinweis: Hinterlassen Sie keine "Ich auch" -Kommentare zu diesem Thema. Jeder, der es angestarrt hat, erhält dabei eine E-Mail. Also bitte einfach "stern".
Sie müssen dann die wenigen Standardschriftarten überladen, beispielsweise in einer Anwendungsklasse :
Wenn Sie dieselbe Schriftartdatei verwenden, können Sie diese natürlich verbessern, um sie nur einmal zu laden.
Ich neige jedoch dazu, nur einen zu überschreiben
"MONOSPACE"
und dann einen Stil einzurichten, um die Anwendung dieser Schriftart zu erzwingen:API 21 Android 5.0
Ich habe die Berichte in den Kommentaren untersucht, dass es nicht funktioniert und mit dem Thema nicht kompatibel zu sein scheint
android:Theme.Material.Light
.Wenn Ihnen dieses Thema nicht wichtig ist, verwenden Sie ein älteres Thema, z.
quelle
"DEFAULT_BOLD"
aber auch ein privates Feld:private static Typeface[] sDefaults;
Sie können versuchen, durch Reflektion und EinstellungsDefaults[Typeface.ITALIC]
auf yourTypeface darauf zuzugreifen. Sehen Sie das.TextView
überall die Standardeinstellungen austauschen zu müssen, um benutzerdefinierte Schriftarten oder eine auf Reflexion basierende Lösung wie diese zu verwenden. In Kombination mit der begrenzten Anzahl von Schriftarten, die in Android verfügbar sind, macht die Entwicklung gut aussehender Apps viel harte Arbeit. Ich habe dem Android Issue Tracker eine Feature-Anfrage hinzugefügt. Wenn Sie diese Funktion sehen möchtenEs gibt eine großartige Bibliothek für benutzerdefinierte Schriftarten in Android: Kalligraphie
Hier ist ein Beispiel, wie man es benutzt.
In Gradle müssen Sie diese Zeile in die build.gradle-Datei Ihrer App einfügen:
und
Application
erstellen Sie dann eine Klasse, die diesen Code erweitert und schreibt:und in der Aktivitätsklasse setzen Sie diese Methode vor onCreate:
und das Letzte, was Ihre Manifestdatei so aussehen sollte:
und es wird die gesamte Aktivität in Ihre Schriftart ändern! es ist einfach und sauber!
quelle
<b></b>
,<u></u>
und<i></i>
in derstrings.xml
Datei und so weit es funktioniert.Dies würde zwar nicht für eine gesamte Anwendung funktionieren, aber für eine Aktivität und könnte für jede andere Aktivität wiederverwendet werden. Ich habe meinen Code dank @ FR073N aktualisiert, um andere Ansichten zu unterstützen. Ich bin nicht sicher über Probleme mit
Buttons
,RadioGroups
usw. , da diese Klassen alle erweiternTextView
, so sollten sie gut funktionieren. Ich habe eine boolesche Bedingung für die Verwendung von Reflektion hinzugefügt, da diese sehr hackig erscheint und die Leistung erheblich beeinträchtigen kann.Hinweis: Wie bereits erwähnt, funktioniert dies nicht für dynamische Inhalte! Dafür ist es möglich, diese Methode mit einer
onCreateView
odergetView
Methode aufzurufen , erfordert jedoch zusätzlichen Aufwand.Um es dann zu benutzen, würden Sie so etwas tun:
Hoffentlich hilft das.
quelle
Zusammenfassend:
Option 1: Verwenden Sie Reflection, um die Schriftart anzuwenden (Kombination der Antwort von Weston & Roger Huang ):
Verwendung in der Anwendungsklasse:
Richten Sie einen Stil ein, um die Anwendung dieser Schriftart zu erzwingen (basierend auf Lovefish ):
Pre-Lollipop:
Lutscher (API 21):
Option 2: Unterklassen Sie jede Ansicht, in der Sie die Schriftart anpassen müssen, d. H. Listview, EditTextView, Knopf, usw. ( Palani ‚s Antwort):
Option 3: Implementieren Sie einen View Crawler, der die Ansichtshierarchie Ihres aktuellen Bildschirms durchläuft:
Variante 1 ( Toms Antwort):
Verwendung :
Variante 2: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere .
Option 4: Verwenden Sie die Drittanbieter-Bibliothek namens Kalligraphie .
Persönlich würde ich Option 4 empfehlen, da dies viele Kopfschmerzen erspart.
quelle
"sans-serif"
innewMap.put(
undmonospace
instyles
?! Ich möchte eine benutzerdefinierte Schriftart mit dem Namen verwendenbarana.ttf
.Ich möchte Westons Antwort für API 21 Android 5.0 verbessern .
Ursache
Unter API 21 enthalten die meisten Textstile die Einstellung fontFamily wie:
Womit die Standardschrift Roboto Regular angewendet wird:
In der ursprünglichen Antwort wird die Monospace-Schriftart nicht angewendet, da android: fontFamily dem Attribut android: typeface ( Referenz) eine höhere Priorität einräumt ) hat. Die Verwendung von Theme.Holo. * Ist eine gültige Problemumgehung, da keine Einstellungen für android: fontFamily enthalten sind.
Lösung
Da Android 5.0 die Systemschrift in die statische Variable Typeface.sSystemFontMap ( Referenz ) einfügt , können wir dieselbe Reflexionstechnik verwenden, um sie zu ersetzen:
quelle
Button
s- und Tool Bar-Titel nicht zu funktionieren scheint . Ich überschreibe die Standardschriftart in MainApplication wie folgt :FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
. Ich benutze Nexus 5, v5.1.1Build.VERSION.SDK_INT == 21
- Das ist gerade imAPI 21
I-Test bei Nexus mit API 22Es ist sehr einfach ... 1.Downloaden Sie Ihre benutzerdefinierte Schriftart und fügen Sie sie in Assets ein. Dann schreiben Sie eine separate Klasse für die Textansicht wie folgt: Hier habe ich die Futura-Schriftart verwendet
}}
und machen Sie folgendes in xml:
quelle
Ich würde auch vorschlagen, TextView und andere Steuerelemente zu erweitern, aber es wäre besser, die Schriftart in Konstrukten einzurichten.
quelle
Ich möchte die Antworten von Weston und Roger Huang für über API 21 Android Lollipop mit dem Thema " Theme.AppCompat " verbessern .
Unter Android 4.4
Über (gleich) API 5.0
Und die FontsOverride- Util-Datei entspricht der Antwort von Weston . Ich habe in diesen Handys getestet:
Nexus 5 (Android 5.1 Primäres Android-System)
ZTE V5 (Android 5.1 CM12.1)
XIAOMI Hinweis (Android 4.4 MIUI6)
HUAWEI C8850 (Android 2.3.5 UNBEKANNT)
quelle
Eine brillante Lösung finden Sie hier: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere .
Erweitern Sie einfach die Aktivitäten von BaseActivity und schreiben Sie diese Methoden. Außerdem sollten Sie Schriftarten besser wie hier beschrieben zwischenspeichern: https://stackoverflow.com/a/16902532/2914140 .
Nach einigen Recherchen habe ich Code geschrieben, der auf dem Samsung Galaxy Tab A (Android 5.0) funktioniert. Verwendeter Code von Weston und Roger Huang sowie https://stackoverflow.com/a/33236102/2914140 . Auch auf Lenovo TAB 2 A10-70L getestet, wo es nicht funktioniert. Ich habe hier eine Schriftart 'Comic Sans' eingefügt, um einen Unterschied zu erkennen.
Um den Code in der gesamten Anwendung auszuführen, sollten Sie in einer Klasse wie Application Folgendes schreiben:
Erstellen Sie einen Ordner "Schriftarten" in "Assets" und legen Sie die erforderlichen Schriftarten dort ab. Eine einfache Anleitung finden Sie hier: https://stackoverflow.com/a/31697103/2914140 .
Das Lenovo Gerät erhält auch fälschlicherweise den Wert einer Schrift. In den meisten Fällen wird Typeface.NORMAL zurückgegeben, manchmal null. Auch wenn eine Textansicht fett gedruckt ist (im XML-Dateilayout). Siehe hier: TextView isBold gibt immer NORMAL zurück . Auf diese Weise ist ein Text auf einem Bildschirm immer in einer normalen Schriftart, nicht fett oder kursiv. Ich denke, es ist ein Fehler eines Produzenten.
quelle
Arbeiten für Xamarin.Android:
Klasse:
Anwendungsimplementierung:
Stil:
quelle
Ab Android O kann dies jetzt direkt aus dem XML definiert werden und mein Fehler ist jetzt geschlossen!
Siehe hier für Details
TL; DR:
Zuerst müssen Sie Ihre Schriftarten zum Projekt hinzufügen
Zweitens fügen Sie eine Schriftfamilie hinzu, wie folgt:
Schließlich können Sie die Schriftart in einem Layout oder Stil verwenden:
Genießen!
quelle
Sie können benutzerdefinierte Schriftarten für jedes Layout einzeln festlegen, indem Sie nur einen Funktionsaufruf von jedem Layout ausführen, indem Sie die Stammansicht übergeben. Erstellen Sie zunächst einen Singelton-Ansatz für den Zugriff auf ein solches Schriftartobjekt
Sie können verschiedene Schriftarten in der obigen Klasse definieren. Definieren Sie jetzt eine Schriftart-Hilfsklasse, die Schriftarten anwendet:
Im obigen Code wende ich Schriftarten nur auf textView und EditText an. Sie können Schriftarten auch auf andere Ansichtselemente anwenden. Sie müssen lediglich die ID Ihrer Stammansichtsgruppe an die oben beschriebene Methode zum Anwenden von Schriftarten übergeben. Zum Beispiel ist Ihr Layout:
Im obigen Layout lautet die übergeordnete Stamm-ID "Hauptübergeordnet". Jetzt können Sie die Schriftart anwenden
Prost :)
quelle
Ich würde vorschlagen, TextView zu erweitern und immer Ihre benutzerdefinierte TextView in Ihren XML-Layouts oder überall dort zu verwenden, wo Sie eine TextView benötigen. Überschreiben Sie in Ihrer benutzerdefinierten Textansicht
setTypeface
quelle
Toms Lösung funktioniert hervorragend, funktioniert aber nur mit TextView und EditText.
Wenn Sie die meisten Ansichten (RadioGroup, TextView, Checkbox ...) abdecken möchten, habe ich folgende Methode erstellt:
Diese Methode gibt den Stil der in XML festgelegten Ansicht (fett, kursiv ...) zurück und wendet sie an, falls vorhanden.
Für die ListView erstelle ich immer einen Adapter und lege die Schriftart in getView fest.
quelle
Ich habe eine Klasse geschrieben, die den Ansichten in der aktuellen Ansichtshierarchie eine Schriftart zuweist und auf den aktuellen Schrifteigenschaften basiert (fett, normal, Sie können andere Stile hinzufügen, wenn Sie möchten):
Jetzt rufen Sie in allen Fragmenten in onViewCreated oder onCreateView, in allen Aktivitäten in onCreate und in allen Ansichtsadaptern in getView oder newView einfach Folgendes auf:
quelle
In API 26 mit build.gradle 3.0.0 und höher können Sie ein Schriftverzeichnis in res erstellen und diese Zeile in Ihrem Stil verwenden
Verwenden Sie dies für change build.gradle in Ihren build.gradle-Abhängigkeiten
quelle
item
allein legt jedoch nicht die Schriftart für die gesamte App fest. irgendeine Ahnung?Schließlich erkannte Google die Schwere dieses Problems (Anwenden einer benutzerdefinierten Schriftart auf UI-Komponenten) und entwickelte eine saubere Lösung dafür.
Zuerst müssen Sie ein Update durchführen, um die Bibliothek 26+ zu unterstützen (möglicherweise müssen Sie auch Ihren Gradle {4.0+}, Android Studio, aktualisieren), dann können Sie einen neuen Ressourcenordner namens font erstellen. In diesem Ordner können Sie Ihre Schriftartenressourcen (.tff, ...) ablegen. Dann müssen Sie die Standard-App überschreiben und Ihre benutzerdefinierte Schriftart darin erzwingen :)
Hinweis: Wenn Sie Geräte mit einer älteren API als 16 unterstützen möchten, müssen Sie anstelle von Android den App-Namespace verwenden!
quelle
Ich möchte auch Westons Antwort für API 21 Android 5.0 verbessern.
Ich hatte das gleiche Problem auf meinem Samsung s5, als ich die DEFAULT-Schriftart verwendete. (mit den anderen Schriftarten funktioniert es gut)
Ich habe es geschafft, es zum Laufen zu bringen, indem ich die Schriftart (zum Beispiel "sans") in XML-Dateien für jede Textansicht oder Schaltfläche festgelegt habe
und in der MyApplication-Klasse:
Ich hoffe es hilft.
quelle
Diese Lösung funktioniert in einigen Situationen nicht richtig.
Also erweitere ich es:
FontsReplacer.java
https://gist.github.com/orwir/6df839e3527647adc2d56bfadfaad805
quelle
Kalligraphie funktioniert ziemlich gut, ist aber für mich nicht geeignet, da sie für eine Schriftfamilie keine unterschiedlichen Gewichte (fett, kursiv usw.) unterstützt.
Also habe ich es mit Fontain versucht , mit dem Sie benutzerdefinierte Ansichten definieren und diese auf benutzerdefinierte Schriftfamilien anwenden können.
Um Fontain verwenden zu können, sollten Sie Ihrem App-Modul build.gradle Folgendes hinzufügen:
Anstatt reguläres TextView zu verwenden, sollten Sie dann FontTextView verwenden
Beispiel für FontTextView mit Großbuchstaben und fettem Inhalt:
quelle
quelle
TextView
sÜberschreiben Sie textViewStyle in Ihrem App-Design, um die Standardschriftfamilie der TextViews zu ändern.
Verwenden Sie für die Verwendung benutzerdefinierter Schriftarten in fontFamily die Schriftartenressourcen, die sich in der Unterstützungsbibliothek befinden.
Die Funktion wurde in Android 26 hinzugefügt, aber über supportlib auf ältere Versionen zurückportiert.
https://developer.android.com/guide/topics/resources/font-resource.html https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html # using-support-lib
quelle
Seit der Veröffentlichung von Android Oreo und seiner Support-Bibliothek (26.0.0) können Sie dies problemlos tun. Beziehen Sie sich auf diese Antwort in einer anderen Frage.
Grundsätzlich sieht Ihr endgültiger Stil folgendermaßen aus:
quelle
Ich fand die Mischung aus Kalligraphie 3-Bibliothek und Coderwalls Post als mein ultimatives Ergebnis.
quelle
Ja, es ist möglich, die Schriftart für die gesamte Anwendung festzulegen.
Der einfachste Weg, dies zu erreichen, besteht darin, die gewünschten Schriftarten in Ihre Anwendung zu packen.
Erstellen Sie dazu einfach ein Assets / einen Ordner im Projektstamm und fügen Sie Ihre Schriftarten (in TrueType- oder TTF-Form) in die Assets ein.
Sie können beispielsweise Assets / Fonts / erstellen und Ihre TTF-Dateien dort ablegen.
quelle