Chcę użyć niestandardowej czcionki dla mojej aplikacji na Androida, którą tworzę.
Mogę indywidualnie zmienić krój każdego obiektu z Code, ale mam ich setki.
Więc,
- Czy istnieje sposób, aby to zrobić z poziomu XML? [Ustawianie niestandardowego kroju pisma]
- Czy jest sposób na zrobienie tego z kodu w jednym miejscu, aby powiedzieć, że cała aplikacja i wszystkie komponenty powinny używać niestandardowego kroju pisma zamiast domyślnego?
Odpowiedzi:
Nie, przepraszam. Możesz określić wbudowane kroje pisma tylko za pomocą XML.Nie żebym był tego świadomy.Obecnie istnieje wiele różnych opcji:
Zasoby czcionek i backporty w zestawie SDK systemu Android, jeśli używasz
appcompat
Biblioteki innych firm dla tych, którzy nie używają
appcompat
, choć nie wszystkie będą obsługiwać definiowanie czcionki w zasobach układuźródło
Tak to mozliwe.
Musisz stworzyć własny widok, który rozszerzy widok tekstu.
W
attrs.xml
wvalues
folderze:W
main.xml
:W
MyTextView.java
:źródło
TextView
. Będzie wymagać niestandardowych podklas dla każdej klasy widżetu, która dziedziczy zTextView
miejsca, w którym ta sama zdolność jest pożądana.Zrobiłem to w bardziej „brutalny sposób”, który nie wymaga zmian w układzie XML ani w Aktywnościach.
Testowano na Androidzie w wersji od 2.1 do 4.4. Uruchom to podczas uruchamiania aplikacji w klasie Application:
Bardziej kompletny przykład można znaleźć pod adresem http://github.com/perchrh/FontOverrideExample
źródło
code
szerokości, a następnie ustawię <style name = "AppTheme" parent = "AppBaseTheme"> <item name = "android: typeface"> monospace </item> </style>,code
to działa, ale nie dla pogrubienia. Dodałem ten kod w klasie, która rozszerza Application. czy to właściwe miejsce? @ P-chanChociaż popieram odpowiedź Manisha jako najszybszą i najbardziej ukierunkowaną metodę, widziałem również naiwne rozwiązania, które po prostu rekurencyjnie powtarzają hierarchię widoków i aktualizują po kolei kroje wszystkich elementów. Coś takiego:
Musisz wywołać tę funkcję w swoich widokach zarówno po zawyżeniu układu, jak iw
onContentChanged()
metodach działania.źródło
Udało mi się to zrobić w sposób scentralizowany, oto wynik:
Mam następujące
Activity
i rozszerzam je, jeśli potrzebuję niestandardowych czcionek:Ale jeśli korzystam z aktywności z pakietu wsparcia,
FragmentActivity
to używam tegoActivity
:Nie testowałem jeszcze tego kodu z
Fragment
s, ale mam nadzieję, że zadziała.My
FontUtils
is simple, które rozwiązuje również wspomniany tutaj problem z pre-ICS https://code.google.com/p/android/issues/detail?id=9904 :źródło
Hej, potrzebuję też 2 różnych czcionek w mojej aplikacji dla różnych widgów! Używam w ten sposób:
W mojej klasie Application tworzę metodę statyczną:
Krój pisma String reprezentuje xyz.ttf w folderze zasobów. (utworzyłem klasę stałych) Teraz możesz jej używać wszędzie w swojej aplikacji:
Jedynym problemem jest to, że potrzebujesz tego dla każdego widżetu, w którym chcesz używać czcionki! Ale myślę, że to najlepszy sposób.
źródło
Korzystając z sugestii pospi i pracując z właściwością „tag”, tak jak zrobił to Richard , stworzyłem niestandardową klasę, która ładuje moje niestandardowe czcionki i stosuje je do widoków zgodnie z ich tagami.
Tak więc zasadniczo zamiast ustawiania TypeFace w atrybucie android: fontFamily używasz android: tag attritube i ustawiasz go na jedną ze zdefiniowanych wyliczeń.
W swojej Aktywności lub Fragmentie po prostu dzwonisz
źródło
Znalazłem fajne rozwiązanie na blogu Lisy Wray . Dzięki nowemu powiązaniu danych możliwe jest ustawienie czcionki w plikach XML.
W XML:
źródło
Myślę, że można to zrobić w wygodniejszy sposób. Następująca klasa ustawi niestandardowy krój czcionki dla wszystkich składników aplikacji (z ustawieniem na klasę).
źródło
Domyślne implementacje LayoutInflater nie obsługują określania kroju czcionki z xml. Widziałem jednak, jak to się robi w XML, dostarczając niestandardową fabrykę dla LayoutInflater, która analizuje takie atrybuty ze znacznika xml.
Podstawowa struktura by tak wyglądała.
Ten artykuł zawiera bardziej szczegółowe wyjaśnienie tych mechanizmów i sposobu, w jaki autor próbuje w ten sposób zapewnić obsługę układu XML dla krojów pisma. Kod autorskiej implementacji można znaleźć tutaj .
źródło
Ustawianie niestandardowej czcionki na zwykły ProgressDialog / AlertDialog:
źródło
Tak, jest to możliwe poprzez zastąpienie domyślnego kroju pisma. I po to rozwiązanie i to działało jak czar dla wszystkich tekstów TextView i ActionBar też z jedną zmianę.
style.xml
Zamiast pliku themes.xml, jak wspomniano w powyższym linku, wspomniałem o domyślnej czcionce do zastąpienia w moim styles.xml w moim domyślnym tagu motywu aplikacji. Domyślne kroje pisma, które można nadpisać, to serif, sans, monospace i normal.
TypefaceUtil.java
Początkowo nie wiedziałem, że kroje pisma do nadpisania są stałe i zestaw zdefiniowanych wartości, ale ostatecznie pomogło mi to zrozumieć, jak Android radzi sobie z czcionkami i krojami pisma oraz ich domyślnymi wartościami, co jest oczywiście innym punktem.
źródło
Nie wiem, czy zmienia to całą aplikację, ale udało mi się zmienić niektóre komponenty, których nie można by zmienić w inny sposób:
źródło
Podoba mi się sugestia pospi. Dlaczego nie pójść na całość, użyj właściwości „tag” widoku (którą możesz określić w XML - „android: tag”), aby określić dodatkowe style, których nie możesz wykonać w XML. Lubię JSON, więc użyłbym ciągu JSON do określenia zestawu klucz / wartość. Ta klasa działa - po prostu zadzwoń
Style.setContentView(this, [resource id])
do swoich zajęć.Oczywiście chciałbyś zająć się czymś więcej niż tylko krojem czcionki, aby korzystanie z JSON było opłacalne.
Zaletą właściwości „tag” jest to, że możesz ustawić ją na podstawowym stylu, którego używasz jako motywu, dzięki czemu będzie ona automatycznie stosowana do wszystkich widoków. EDYCJA: Wykonanie tej czynności powoduje awarię podczas inflacji na Androidzie 4.0.3. Nadal można używać stylu i indywidualnie stosować go do widoków tekstu.
Jedna rzecz, którą zobaczysz w kodzie - niektóre widoki mają tag, ale żaden nie jest wyraźnie ustawiony - co dziwne, jest to ciąg znaków „Αποκοπή” - który według tłumacza Google jest „wycięty” po grecku! Co do cholery...?
źródło
Odpowiedź @ majinboo została poprawiona pod kątem wydajności i zarządzania pamięcią. Dowolne działanie powiązane z więcej niż jedną czcionką może używać tej klasy Font, podając sam konstruktor jako parametr.
Klasa poprawionych czcionek jest następująca:
źródło
Praca dla platformy Xamarin.Android:
Klasa:
Wdrażanie aplikacji:
Styl:
źródło
Wygląda na to, że korzystanie z niestandardowych czcionek zostało ułatwione dzięki Androidowi O. Aby to osiągnąć, możesz w zasadzie użyć XML. Dołączyłem link do oficjalnej dokumentacji Androida w celach informacyjnych i mam nadzieję, że pomoże to ludziom, którzy nadal potrzebują tego rozwiązania. Praca z niestandardowymi czcionkami w systemie Android
źródło
Warto wiedzieć, że począwszy od systemu Android 8.0 (poziom interfejsu API 26) można użyć niestandardowej czcionki w języku XML .
Mówiąc najprościej, możesz to zrobić w następujący sposób.
Umieść czcionkę w folderze
res/font
.Użyj go w atrybucie widgetu
<Button android:fontFamily="@font/myfont"/>
lub włóż
res/values/styles.xml
i użyj go jako stylu
źródło
Użyj atrybutu „fontPath” bezpośrednio w pliku xml.
do użytku w style.xml
<item name = "fontPath"> fonts / ProximaNovaSemibold.ttf </item>
do użytku w pliku układu bezpośredniego
fontPath = "fonts / ProximaNovaBold.ttf"
(Uwaga: nie ma potrzeby używania atrybutu app / android w prefiksie)
źródło
Absolutnie możliwe. Można to zrobić na wiele sposobów. Najszybciej stwórz warunek metodą try - catch .. wypróbuj warunek określonego stylu czcionki, wyłap błąd i zdefiniuj inny styl czcionki.
źródło