Ustawianie stylów globalnych dla widoków w systemie Android
125
Powiedzmy, że chcę mieć wszystkie TextViewwystąpienia w mojej aplikacji textColor="#ffffff". Czy istnieje sposób, aby ustawić to w jednym miejscu, zamiast ustawiać to dla każdego TextView?
Właściwie możesz ustawić domyślny styl dla TextViews (i większości innych wbudowanych widżetów) bez konieczności tworzenia niestandardowej klasy Java lub ustawiania stylu indywidualnie.
Jeśli spojrzysz themes.xmlna źródło Androida, zobaczysz kilka atrybutów domyślnego stylu dla różnych widżetów. Kluczem jest atrybut textViewStyle(lub editTextStyleitp.), Który można zastąpić w kompozycji niestandardowej. Możesz to zmienić w następujący sposób:
Najbardziej eleganckie rozwiązanie, jakie do tej pory widziałem.
Italo Borssatto
@Steve, jeśli dołączę element <item name="android:textViewStyle">@style/MyTextViewStyle</item>do stylu MyTheme, a następnie zastosuję styl do mojej aplikacji, wszystkie moje TextViews będą wyświetlane zgodnie ze stylem (nawet nazwa aplikacji na pasku akcji). Jak rozwiązać ten problem za pomocą paska akcji? Chcę, żeby miał domyślny wygląd. Github
Maksim Dmitriev
@Steve, Jak zastosować motyw zarówno (paska akcji, jak i widżetu) w aplikacji
Pratik Butani
Nie jestem pewien, jak odróżnić ActionBar od innych rzeczy. Możesz znaleźć miejsce, w którym ustawiono styl ActionBar, a następnie umieścić je <item name="android:textViewStyle">@style/MyTextViewStyle</item>tam, po prostu wskazując na domyślny ActionBar (lub coś podobnego)
Steve Pomeroy,
@StevePomeroy to nie działa dla mnie ... czy możesz zapewnić wsparcie. Mój styl dla TextViews pozostaje taki sam. Czy istnieje minimum elementów, które muszę ustawić, czy też są elementy, których nie mogę ustawić?
Mike
52
Można to zrobić na dwa sposoby:
1. Używanie stylów
Możesz zdefiniować własne style, tworząc pliki XML w res/valueskatalogu. Załóżmy więc, że chcesz mieć czerwony i pogrubiony tekst, a następnie utwórz plik z następującą zawartością:
Możesz na przykład nazwać go tak, jak chcesz res/values/red.xml. Następnie jedyne, co musisz zrobić, to użyć tego widoku w wybranych widżetach, na przykład:
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewstyle="@style/MyRedTheme"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="This is red, isn't it?"/></LinearLayout>
Jest to kolejny możliwy sposób osiągnięcia tego celu i polegałby na zapewnieniu własnego, TextViewktóry ustawiałby kolor tekstu zawsze na taki, jaki chcesz; na przykład:
Następnie musisz po prostu traktować to jako normalne TextVieww swoim pliku XML:
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><org.example.RedTextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="This is red, isn't it?"/></LinearLayout>
To, czy wybierzesz jeden, czy inny wybór, zależy od Twoich potrzeb. Jeśli jedyną rzeczą, którą chcesz zrobić, jest modyfikacja wyglądu, najlepszym podejściem jest pierwsze. Z drugiej strony, jeśli chcesz zmienić wygląd i dodać nowe funkcje do swoich widżetów, druga jest do zrobienia.
Używanie klas niestandardowych powinno być preferowane, ponieważ jest to czystsze podejście i pomaga zachować niewielką wagę pliku xml.
Amit Kumar
@AmitKumar Nie, nie powinni! W tym konkretnym przypadku oznaczałoby to użycie oddzielnej klasy niestandardowej dla każdej wartości atrybutu. To generuje dużo nadmiarowego kodu i sprawia, że rzeczywisty układ nie jest już czytelny (będziesz musiał odwiedzić każdą klasę, aby zobaczyć, co robi, zamiast po prostu czytać kilka wierszy xml). Klasy niestandardowe powinny być używane tylko wtedy, gdy modyfikujesz zachowanie, ale nie wtedy, gdy jedyną zmianą jest wygląd widoku.
Andre
Czy nie można ustawić stylu widoku niestandardowego z XML? Dlaczego nie możemy go użyć w custom_view_layout.xmlpliku używanym do nadmuchania klasy niestandardowej?
lucidbrot
5
Aby uzyskać domyślny kolor tekstu w TextView, ustaw android:textColorTertiaryw motywie żądany kolor:
Wiele innych kolorów kontrolek systemu Android można kontrolować za pomocą atrybutów struktury lub obsługi atrybutów biblioteki, jeśli używasz biblioteki obsługi.
Aby uzyskać listę atrybutów, które można wybierać, sprawdź kod źródłowy Androida z styles.xmli themes.xmlczy to bardzo pomocne Istota Dan Lew, spróbuj zmienić każdą wartość i zobaczyć, co zmieni się na ekranie.
Dziękuje! Spędziłem sporo czasu, zastanawiając się, dlaczego textColorPrimary nie działa.
pratt
3
Zdefiniuj styl i użyj go na każdym widżecie, zdefiniuj motyw, który zastępuje domyślne ustawienie Androida dla tego widżetu lub zdefiniuj zasób ciągu i odwołuj się do niego w każdym widżecie
Odpowiedzi:
Właściwie możesz ustawić domyślny styl dla TextViews (i większości innych wbudowanych widżetów) bez konieczności tworzenia niestandardowej klasy Java lub ustawiania stylu indywidualnie.
Jeśli spojrzysz
themes.xml
na źródło Androida, zobaczysz kilka atrybutów domyślnego stylu dla różnych widżetów. Kluczem jest atrybuttextViewStyle
(lubeditTextStyle
itp.), Który można zastąpić w kompozycji niestandardowej. Możesz to zmienić w następujący sposób:Utwórz
styles.xml
:Następnie po prostu zastosuj ten motyw do swojej aplikacji w
AndroidManifest.xml
:Wszystkie widoki tekstu będą domyślnie miały styl zdefiniowany w
MyTextViewStyle
(w tym przypadku pogrubiony i czerwony)!Zostało to przetestowane na urządzeniach od poziomu API 4 i wydaje się, że działa świetnie.
źródło
<item name="android:textViewStyle">@style/MyTextViewStyle</item>
do stylu MyTheme, a następnie zastosuję styl do mojej aplikacji, wszystkie mojeTextView
s będą wyświetlane zgodnie ze stylem (nawet nazwa aplikacji na pasku akcji). Jak rozwiązać ten problem za pomocą paska akcji? Chcę, żeby miał domyślny wygląd. Github<item name="android:textViewStyle">@style/MyTextViewStyle</item>
tam, po prostu wskazując na domyślny ActionBar (lub coś podobnego)Można to zrobić na dwa sposoby:
1. Używanie stylów
Możesz zdefiniować własne style, tworząc pliki XML w
res/values
katalogu. Załóżmy więc, że chcesz mieć czerwony i pogrubiony tekst, a następnie utwórz plik z następującą zawartością:Możesz na przykład nazwać go tak, jak chcesz
res/values/red.xml
. Następnie jedyne, co musisz zrobić, to użyć tego widoku w wybranych widżetach, na przykład:Więcej informacji znajdziesz w tym artykule: Zrozumienie motywów i stylów Androida
2. Korzystanie z klas niestandardowych
Jest to kolejny możliwy sposób osiągnięcia tego celu i polegałby na zapewnieniu własnego,
TextView
który ustawiałby kolor tekstu zawsze na taki, jaki chcesz; na przykład:Następnie musisz po prostu traktować to jako normalne
TextView
w swoim pliku XML:To, czy wybierzesz jeden, czy inny wybór, zależy od Twoich potrzeb. Jeśli jedyną rzeczą, którą chcesz zrobić, jest modyfikacja wyglądu, najlepszym podejściem jest pierwsze. Z drugiej strony, jeśli chcesz zmienić wygląd i dodać nowe funkcje do swoich widżetów, druga jest do zrobienia.
źródło
custom_view_layout.xml
pliku używanym do nadmuchania klasy niestandardowej?Aby uzyskać domyślny kolor tekstu w
TextView
, ustawandroid:textColorTertiary
w motywie żądany kolor:Wiele innych kolorów kontrolek systemu Android można kontrolować za pomocą atrybutów struktury lub obsługi atrybutów biblioteki, jeśli używasz biblioteki obsługi.
Aby uzyskać listę atrybutów, które można wybierać, sprawdź kod źródłowy Androida z
styles.xml
ithemes.xml
czy to bardzo pomocne Istota Dan Lew, spróbuj zmienić każdą wartość i zobaczyć, co zmieni się na ekranie.źródło
Zdefiniuj styl i użyj go na każdym widżecie, zdefiniuj motyw, który zastępuje domyślne ustawienie Androida dla tego widżetu lub zdefiniuj zasób ciągu i odwołuj się do niego w każdym widżecie
źródło