Muszę używać określonej czcionki dla całej mojej aplikacji. Mam plik .ttf na to samo. Czy można ustawić tę czcionkę domyślną podczas uruchamiania aplikacji, a następnie użyć jej w innym miejscu aplikacji? Po ustawieniu, jak używać go w plikach XML układu?
java
android
android-fonts
Samuh
źródło
źródło
Odpowiedzi:
Tak z refleksją. To działa ( na podstawie tej odpowiedzi ):
(Uwaga: jest to obejście ze względu na brak obsługi niestandardowych czcionek, więc jeśli chcesz zmienić tę sytuację, zrób gwiazdkę, aby głosować tutaj na problem z Androidem ). Uwaga: nie zostawiaj komentarzy „ja też” na ten temat, wszyscy, którzy się na nią gapili, otrzymają wiadomość e-mail. Poprostu „gwiazdkuj”.
Następnie musisz przeładować kilka domyślnych czcionek, na przykład w klasie aplikacji :
Lub oczywiście, jeśli używasz tego samego pliku czcionek, możesz to poprawić, aby załadować go tylko raz.
Jednak staram się po prostu przesłonić jeden, powiedzmy
"MONOSPACE"
, a następnie ustawić styl, aby wymusić na aplikacji szeroką czcionkę:API 21 Android 5.0
Sprawdziłem raporty w komentarzach, że to nie działa i wydaje się być niezgodne z tematem
android:Theme.Material.Light
.Jeśli ten motyw nie jest dla Ciebie ważny, użyj starszego motywu, np .:
źródło
"DEFAULT_BOLD"
również pole prywatne:private static Typeface[] sDefaults;
możesz spróbować uzyskać do niego dostęp poprzez refleksję i ustawieniesDefaults[Typeface.ITALIC]
swojegoTypeface. Zobacz to.TextView
wszędzie wymieniać domyślne, aby użyć niestandardowych czcionek lub zastosować takie rozwiązanie oparte na odbiciu. W połączeniu z ograniczającym zestawem czcionek dostępnych w Androidzie sprawia, że tworzenie dobrze wyglądających aplikacji jest ciężką pracą. Dodałem żądanie funkcji do narzędzia do śledzenia problemów w Androidzie. Jeśli chcesz zobaczyć tę funkcję, możesz oznaczyć ten problem gwiazdką tutaj: code.google.com/p/android/issues/…W Androidzie jest świetna biblioteka niestandardowych czcionek: Kaligrafia
Oto próbka jak go użyć.
w Gradle musisz umieścić tę linię w pliku build.gradle aplikacji:
a następnie utwórz klasę rozszerzającą
Application
i napisz ten kod:i w klasie aktywności umieść tę metodę przed onCreate:
i ostatnia rzecz, jaką powinien wyglądać twój plik manifestu:
i zmieni całą aktywność na twoją czcionkę! to proste i czyste!
źródło
<b></b>
,<u></u>
a<i></i>
wstrings.xml
pliku i do tej pory działa.Chociaż nie działałoby to w przypadku całej aplikacji, działałoby w przypadku działania i może być ponownie użyte w przypadku każdego innego działania. Zaktualizowałem swój kod dzięki @ FR073N, aby obsługiwać inne widoki. Nie jestem pewien co do problemów z
Buttons
,RadioGroups
itp., Ponieważ wszystkie te klasy rozszerzają się,TextView
więc powinny działać dobrze. Dodałem wartość logiczną warunkującą użycie odbicia, ponieważ wydaje się bardzo hackerska i może znacząco pogorszyć wydajność.Uwaga: jak wskazano, nie będzie to działać w przypadku treści dynamicznych! W tym celu można wywołać tę metodę za pomocą powiedzmy metodę
onCreateView
lubgetView
, ale wymaga dodatkowego wysiłku.Następnie, aby go użyć, zrobiłbyś coś takiego:
Mam nadzieję, że to pomaga.
źródło
W podsumowaniu:
Opcja nr 1: Użyj refleksji, aby zastosować czcionkę (łącząc odpowiedź Westona i Rogera Huanga ):
Zastosowanie w klasie aplikacji:
ustaw styl, aby wymusić szeroką czcionkę tej aplikacji (w oparciu o lovefisha ):
Pre-Lollipop:
Lollipop (API 21):
Opcja 2: Podklasuj każdy widok, w którym musisz dostosować czcionkę, tj. ListView, EditTextView, Button itp. (Odpowiedź Palani ):
Opcja 3: Zaimplementuj widok przeszukiwacza, który przechodzi przez hierarchię widoków bieżącego ekranu:
Wariant nr 1 (odpowiedź Toma ):
Stosowanie :
Odmiana nr 2: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere .
Opcja # 4: Użyj Lib trzeciej strony o nazwie Kaligrafia .
Osobiście poleciłbym opcję nr 4, ponieważ oszczędza ona wielu bólów głowy.
źródło
"sans-serif"
innewMap.put(
imonospace
instyles
?! Chcę użyć niestandardowej czcionki o nazwiebarana.ttf
.Chciałbym poprawić odpowiedź Westona dla API 21 Android 5.0.
Przyczyna
W API 21 większość stylów tekstowych zawiera ustawienie fontFamily, takie jak:
Który stosuje domyślną czcionkę Roboto Regular:
Oryginalna odpowiedź nie stosuje czcionki Monospace, ponieważ android: fontFamily ma większy priorytet niż android: atrybut kroju czcionki ( odwołanie ). Korzystanie z Theme.Holo. * Jest poprawnym obejściem, ponieważ nie ma w nim ustawień Androida: fontFamily.
Rozwiązanie
Ponieważ Android 5.0 umieścił krój pisma systemowego w zmiennej statycznej Typeface.sSystemFontMap ( odniesienie ), możemy zastosować tę samą technikę odbicia, aby go zastąpić:
źródło
Button
tytułów i pasków narzędzi. Jestem przesłanianie domyślną czcionkę w MainApplication następująco:FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
. Korzystam z Nexusa 5, wer. 5.1.1Build.VERSION.SDK_INT == 21
- To tylko wAPI 21
teście I w Nexusie z API 22jego bardzo proste ... 1. Pobierz i umieść swoją niestandardową czcionkę w zasobach .. następnie napisz jedną osobną klasę do wyświetlania tekstu w następujący sposób: tutaj użyłem czcionki futura
}
i wykonaj następujące czynności w xml:
źródło
Sugerowałbym również rozszerzenie TextView i innych formantów, ale lepiej byłoby rozważyć ustawienie czcionki w konstrukcjach.
źródło
Chciałbym poprawić odpowiedzi Westona i Rogera Huanga na ponad API Lollipop dla Androida 21 z motywem „ Theme.AppCompat ”.
Poniżej Androida 4.4
Ponad (równy) API 5.0
A FontsOverride util pliku to samo, co w Weston „s odpowiedź. Testowałem w tych telefonach:
Nexus 5 (podstawowy system Android 5.1)
ZTE V5 (Android 5.1 CM12.1)
Uwaga XIAOMI (Android 4.4 MIUI6)
HUAWEI C8850 (Android 2.3.5 UNKNOWN)
źródło
Świetne rozwiązanie można znaleźć tutaj: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere .
Po prostu rozszerz działania z BaseActivity i napisz te metody. Powinieneś także lepiej buforować czcionki, jak opisano tutaj: https://stackoverflow.com/a/16902532/2914140 .
Po kilku badaniach napisałem kod, który działa w Samsung Galaxy Tab A (Android 5.0). Użyto kodu weston i Roger Huang oraz https://stackoverflow.com/a/33236102/2914140 . Przetestowano również na Lenovo TAB 2 A10-70L, gdzie nie działa. Wstawiłem tutaj czcionkę „Comic Sans”, aby zobaczyć różnicę.
Aby uruchomić kod w całej aplikacji, powinieneś napisać w klasie, np. Application, co następuje:
Utwórz folder „czcionek” w „zasobach” i umieść tam potrzebne czcionki. Prostą instrukcję można znaleźć tutaj: https://stackoverflow.com/a/31697103/2914140 .
Urządzenie Lenovo również niepoprawnie otrzymuje wartość kroju pisma. W większości przypadków zwraca czcionkę Typ.NORMALNY, czasem null. Nawet jeśli TextView jest pogrubiony (w układzie pliku xml). Zobacz tutaj: TextView isBold zawsze zwraca NORMAL . W ten sposób tekst na ekranie ma zawsze czcionkę reguralną, a nie pogrubioną lub pochyloną. Myślę więc, że to błąd producenta.
źródło
Praca dla Xamarin.Android:
Klasa:
Implementacja aplikacji:
Styl:
źródło
Od Androida O można teraz definiować bezpośrednio z pliku XML, a mój błąd jest teraz zamknięty!
Zobacz tutaj, aby uzyskać szczegółowe informacje
TL; DR:
Najpierw musisz dodać czcionki do projektu
Po drugie dodajesz rodzinę czcionek, na przykład:
Wreszcie możesz użyć czcionki w układzie lub stylu:
Cieszyć się!
źródło
Możesz ustawić niestandardowe czcionki dla każdego układu jeden po drugim, za pomocą tylko jednego wywołania funkcji z każdego układu, przekazując jego główny widok. Po pierwsze, stwórz pojedyncze podejście do dostępu do obiektu czcionki takiego
Możesz zdefiniować różne czcionki w powyższej klasie. Teraz zdefiniuj klasę pomocnika czcionek, która zastosuje czcionki:
W powyższym kodzie stosuję czcionki tylko do textView i EditText, możesz również stosować czcionki do innych elementów widoku podobnie. Musisz tylko przekazać identyfikator swojej głównej grupy widoków do powyższej metody stosowania czcionek. na przykład twój układ to:
W powyższym układzie głównym elementem nadrzędnym jest „Główny element nadrzędny”, który pozwala teraz zastosować czcionkę
Twoje zdrowie :)
źródło
Sugerowałbym rozszerzenie TextView i zawsze używanie niestandardowego TextView w układach XML lub wszędzie tam, gdzie potrzebujesz TextView. W niestandardowym widoku tekstowym zastąp
setTypeface
źródło
Rozwiązanie Toma działa świetnie, ale działa tylko z TextView i EditText.
Jeśli chcesz pokryć większość widoków (RadioGroup, TextView, Checkbox ...), stworzyłem metodę, która to robi:
Ta metoda przywróci styl widoku ustawiony w XML (pogrubienie, kursywa ...) i zastosuje je, jeśli takie istnieją.
W przypadku ListView zawsze tworzę adapter i ustawiam czcionkę w getView.
źródło
Napisałem klasę przypisującą krój pisma do widoków w bieżącej hierarchii widoków i opierając się na bieżących właściwościach kroju pisma (pogrubienie, normalne, jeśli chcesz, możesz dodać inne style):
Teraz we wszystkich fragmentach w onViewCreated lub onCreateView, we wszystkich działaniach w onCreate i we wszystkich adapterach widoku w getView lub newView wystarczy wywołać:
źródło
w API 26 z build.gradle 3.0.0 i nowszym możesz utworzyć katalog czcionek w res i użyć tej linii w swoim stylu
do zmiany build.gradle użyj tego w zależnościach build.gradle
źródło
item
to nie ustawia czcionki dla całej aplikacji. jakaś wskazówka?Wreszcie Google zdało sobie sprawę z powagi tego problemu (stosując niestandardową czcionkę do składników interfejsu użytkownika) i opracowało dla niego czyste rozwiązanie.
Najpierw musisz zaktualizować, aby obsługiwał bibliotekę 26+ (może być także konieczna aktualizacja klasy {4.0+}, studio Android), a następnie możesz utworzyć nowy folder zasobów o nazwie font. W tym folderze możesz umieścić zasoby czcionek (.tff, ...). Następnie musisz zastąpić domyślną aplikację i nałożyć na nią niestandardową czcionkę :)
Uwaga: jeśli chcesz obsługiwać urządzenia ze starszym API niż 16, musisz użyć przestrzeni nazw aplikacji zamiast Androida!
źródło
Chciałbym również poprawić odpowiedź Westona na API 21 Android 5.0.
Miałem ten sam problem na moim telefonie Samsung s5, gdy korzystałem z czcionki DOMYŚLNEJ. (z innymi czcionkami działa dobrze)
Udało mi się go uruchomić, ustawiając krój pisma (na przykład „sans”) w plikach XML dla każdego widoku tekstu lub przycisku
oraz w MyApplication Class:
Mam nadzieję, że to pomoże.
źródło
To rozwiązanie nie działa poprawnie w niektórych sytuacjach.
Więc przedłużam to:
FontsReplacer.java
https://gist.github.com/orwir/6df839e3527647adc2d56bfadfaad805
źródło
Kaligrafia działa całkiem dobrze, ale nie jest dla mnie odpowiednia, ponieważ nie obsługuje różnych grubości (pogrubienie, kursywa itp.) Dla rodziny czcionek.
Więc spróbowałem Fontaina , która pozwala zdefiniować niestandardowe widoki i zastosować je do niestandardowych rodzin czcionek.
w celu korzystania z Fontain, należy dodać do build.gradle modułu aplikacji:
Następnie zamiast zwykłego TextView powinieneś użyć FontTextView
Przykład FontTextView z dużymi i pogrubionymi treściami:
źródło
źródło
TextView
sAby zmienić domyślną rodzinę czcionek TextViews, zastąp tekst textViewStyle w motywie aplikacji.
Aby użyć niestandardowej czcionki w fontFamily, użyj zasobów czcionek znajdujących się w bibliotece obsługi.
Ta funkcja została dodana w Androidzie 26, ale przeniesiona do starszych wersji za pośrednictwem supportlib.
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
źródło
Od wydania Androida Oreo i jego biblioteki wsparcia (26.0.0) możesz to zrobić łatwo. Odnieś się do tej odpowiedzi w innym pytaniu.
Zasadniczo twój ostateczny styl będzie wyglądał następująco:
źródło
Jako ostateczny wynik znalazłem mieszankę biblioteki kaligrafii 3 i postu ściany kodowej .
źródło
Tak, możliwe jest ustawienie czcionki dla całej aplikacji.
Najłatwiejszym sposobem na osiągnięcie tego jest spakowanie żądanej czcionki (czcionek) w aplikacji.
Aby to zrobić, po prostu utwórz zasób / folder w katalogu głównym projektu i umieść czcionki (w formacie TrueType lub TTF) w zasobach.
Możesz na przykład utworzyć zasoby / czcionki / i umieścić tam swoje pliki TTF.
źródło