Generalnie nie można programowo zmieniać stylów; możesz ustawić wygląd ekranu, części układu lub pojedynczego przycisku w układzie XML za pomocą motywów lub stylów . Motywy można jednak stosować programowo .
Istnieje również coś, StateListDrawable
co pozwala zdefiniować różne drawables dla każdego stanu, w którym Button
możesz się znajdować, niezależnie od tego, czy jest skoncentrowany, wybrany, wciśnięty, wyłączony i tak dalej.
Na przykład, aby przycisk zmieniał kolor po naciśnięciu, możesz zdefiniować plik XML o nazwie res/drawable/my_button.xml
katalog w następujący sposób:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/btn_pressed" />
<item
android:state_pressed="false"
android:drawable="@drawable/btn_normal" />
</selector>
Następnie możesz zastosować ten selektor do a Button
, ustawiając właściwość android:background="@drawable/my_button"
.
style
atrybutu Androida , ale możesz programowo ustawić tło wButton
taki sam sposób, jak możesz, z dowolnym innym widokiem, jeśli to wystarczy. Ponadto, jakoButton
dziedziczenie zTextView
, możesz zmieniać właściwości tekstu. Wystarczy spojrzeć na dokumentację API dla tych elementów ... developer.android.com/reference/android/view/Po pierwsze, nie musisz używać inflatera układu, aby utworzyć prosty przycisk. Możesz po prostu użyć:
Jeśli chcesz nadać styl przyciskowi, masz dwie możliwości: najprostsza to po prostu określenie wszystkich elementów w kodzie, jak sugeruje wiele innych odpowiedzi:
Inną opcją jest zdefiniowanie stylu w XML i zastosowanie go do przycisku. W ogólnym przypadku możesz użyć
ContextThemeWrapper
do tego:Aby zmienić atrybuty związane z tekstem w TextView (lub jego podklasach, takich jak Button), istnieje specjalna metoda:
Ten ostatni nie może być użyty do zmiany wszystkich atrybutów; na przykład, aby zmienić dopełnienie, musisz użyć pliku
ContextThemeWrapper
. Ale dla koloru, rozmiaru tekstu itp. Możesz użyćsetTextAppearance
.źródło
Tak, możesz użyć na przykład w przycisku
źródło
Możesz tworzyć atrybuty stylu, takie jak:
zamiast:
źródło
Jeśli korzystasz z biblioteki pomocy technicznej, możesz po prostu użyć
dla TextViews i Buttons. Dla pozostałych widoków są podobne klasy :-)
źródło
Dla każdego, kto szuka materialnej odpowiedzi, zobacz ten wpis SO: Przyciski kolorowania w systemie Android z Material Design i AppCompat
Użyłem kombinacji tej odpowiedzi, aby ustawić domyślny kolor tekstu przycisku na biały dla mojego przycisku: https://stackoverflow.com/a/32238489/3075340
Następnie ta odpowiedź https://stackoverflow.com/a/34355919/3075340, aby programowo ustawić kolor tła. Kod do tego to:
your_colored_button
może to być zwykłyButton
przycisk lub przycisk AppCompat, jeśli chcesz - przetestowałem powyższy kod z obydwoma typami przycisków i działa.EDYCJA: Odkryłem, że urządzenia pre-Lollipop nie działają z powyższym kodem. Zobacz ten post, aby dowiedzieć się, jak dodać obsługę urządzeń sprzed wersji Lollipop: https://stackoverflow.com/a/30277424/3075340
Zasadniczo zrób to:
źródło
W zależności od atrybutów stylu, które chcesz zmienić, możesz skorzystać z biblioteki Paryża:
Obsługiwanych jest wiele atrybutów, takich jak tło, wypełnienie, textSize, textColor itp.
Zastrzeżenie: jestem autorem biblioteki.
źródło
Odpowiedź udzielona przez @Dayerman i @h_rules jest właściwa. Aby podać rozbudowany przykład z kodem, w folderze do rysowania utwórz plik xml o nazwie button_disabled.xml
Następnie w Javie
Spowoduje to ustawienie właściwości przycisku na wyłączone i ustawienie koloru na srebrny.
[Kolor jest zdefiniowany w color.xml jako:
źródło
W czasie działania wiesz, jaki styl chcesz mieć przycisk. Tak więc wcześniej, w XML w folderze układu, możesz mieć wszystkie gotowe przyciski z potrzebnymi stylami. Więc w folderze układu możesz mieć plik o nazwie: button_style_1.xml. Zawartość tego pliku może wyglądać następująco:
Jeśli pracujesz z fragmentami, to w onCreateView nadmuchujesz ten przycisk, na przykład:
gdzie container to kontener ViewGroup skojarzony z metodą onCreateView, którą nadpisujesz podczas tworzenia fragmentu.
Potrzebujesz jeszcze dwóch takich przycisków? Tworzysz je w ten sposób:
Możesz dostosować te przyciski:
Następnie dodajesz dostosowane, stylizowane przyciski do kontenera układu, który również zawyżasz w metodzie onCreateView:
I tak można dynamicznie pracować ze stylizowanymi przyciskami.
źródło
Zrobiłem do tego interfejs pomocniczy, używając wzoru uchwytu.
Teraz dla każdego stylu, którego chcesz używać pragmatycznie, po prostu zaimplementuj interfejs, na przykład:
Zadeklaruj styl w swoim
attrs.xml
, stylizowany na ten przykład to:Oto styl zadeklarowany w
styles.xml
:I wreszcie implementacja posiadacza stylu:
Uważam, że jest to bardzo pomocne, ponieważ można go łatwo ponownie wykorzystać i zachowuje kod czysty i rozwlekły, zalecałbym używanie tego tylko jako zmiennej lokalnej, abyśmy mogli pozwolić odśmiecaczowi pamięci wykonać swoją pracę, gdy skończymy ustawiać wszystkie style .
źródło
Ostatnio miałem ten sam problem. oto jak to rozwiązałem.
Dzięki !
źródło