Przed dzisiejszą AppCompat
aktualizacją mogłem zmienić kolor przycisków w Androidzie L, ale nie w starszych wersjach. Po dołączeniu nowej aktualizacji AppCompat nie mogę zmienić koloru żadnej z wersji, kiedy próbuję, przycisk po prostu znika. Czy ktoś wie, jak zmienić kolor przycisku?
Poniższe zdjęcia pokazują, co chcę osiągnąć:
Biały przycisk jest domyślny, czerwony jest tym, czego chcę.
To właśnie robiłem wcześniej, aby zmienić kolor przycisków w styles.xml
:
<item name="android:colorButtonNormal">insert color here</item>
i zrobić to dynamicznie:
button.getBackground().setColorFilter(getResources().getColor(insert color here), PorterDuff.Mode.MULTIPLY);
Zmieniłem też temat nadrzędny z @android:style/Theme.Material.Light.DarkActionBar
naTheme.AppCompat.Light.DarkActionBar
Odpowiedzi:
Oficjalnie naprawiono w bibliotece pomocy technicznej wer. 22 (pt. 13 marca 2015 r.). Zobacz odpowiedni problem z kodem Google:
https://issuetracker.google.com/issues/37008632
Przykład użycia
theme.xml:
v21 / theme.xml
źródło
android:theme="@style/ColoredButton"
oraz w styles.xml<style name="ColoredButton" parent="Widget.AppCompat.Button"> <item name="colorButtonNormal">@color/button_yellow</item> </style>
Edytuj (22.06.2016):
Biblioteka Appcompat zaczęła obsługiwać przyciski materiałów po opublikowaniu oryginalnej odpowiedzi. W tym poście możesz zobaczyć najłatwiejszą implementację podniesionych i płaskich przycisków.
Oryginalna odpowiedź:
Ponieważ ten AppCompat nie obsługuje jeszcze przycisku, możesz używać xml jako tła. Aby to zrobić, rzuciłem okiem na kod źródłowy Androida i znalazłem powiązane pliki do stylizacji przycisków materiałów.
1 - Spójrz na oryginalną implementację przycisku materiału ze źródła.
Spójrz na plik btn_default_material.xml w kodzie źródłowym Androida .
Możesz skopiować plik do folderu Drawable-v21 projektów. Ale nie dotykaj tutaj koloru attr. Plik, który musisz zmienić, to drugi plik.
drawable-v21 / custom_btn.xml
2 - Uzyskaj kształt oryginalnego przycisku materiału
Jak sobie uświadamiacie, w tym rysunku można znaleźć kształt, który można znaleźć w tym pliku kodu źródłowego .
3 - Uzyskanie wymiarów przycisku materiału
W tym pliku znajdują się pewne wymiary z pliku , który można znaleźć tutaj . Możesz skopiować cały plik i umieścić go w folderze wartości . Jest to ważne, aby zastosować ten sam rozmiar (który jest używany w materiałowych przyciskach) do wszystkich przycisków
4 - Utwórz kolejny plik do rysowania dla starych wersji
W starszych wersjach powinieneś mieć inną rysownię o tej samej nazwie. Bezpośrednio umieszczam elementy w linii zamiast odwoływania się. Możesz odwoływać się do nich. Ale znowu najważniejszą rzeczą są oryginalne wymiary przycisku materiału.
drawable / custom_btn.xml
Wynik
Twój przycisk będzie miał efekt falowania na urządzeniach Lollipop. Stare wersje będą miały dokładnie ten sam przycisk, z wyjątkiem efektu marszczenia. Ale ponieważ udostępniasz drawable dla różnych stanów, będą one również reagować na zdarzenia dotykowe (jak w starym stylu).
źródło
Zostało to ulepszone w wersji 23.0.0 biblioteki AppCompat, dodając więcej motywów, w tym
Przede wszystkim uwzględnij zależność appCompat, jeśli jeszcze tego nie zrobiłeś
teraz, ponieważ musisz używać wersji v23 aplikacji zgodnej, musisz również kierować reklamy na SDK-v23!
W Twoim
values/theme
W Twoim
values/style
W Twoim
values-v21/style
Ponieważ motyw przycisku jest oparty na
Widget.AppCompat.Button.Colored
Kolor tekstu na przycisku jest domyślnie biały!ale wydaje się, że występuje problem po wyłączeniu przycisku, przycisk zmieni kolor na jasnoszary, ale kolor tekstu pozostanie biały!
obejściem tego problemu jest specjalne ustawienie koloru tekstu na przycisku na biały! jak zrobiłem w stylu pokazanym powyżej.
teraz możesz po prostu zdefiniować swój przycisk i pozwolić AppCompat zrobić resztę :)
Stan niepełnosprawny
Włączony stan
Edytować:
Dodać
<Button android:theme="@style/BrandButtonStyle"/>
źródło
<Button android:theme="@style/BrandButtonStyle"/>
. To musi byćtheme
atrybutem i niestyle
atrybut.W Bibliotece pomocy Android 22.1.0 Google poinformował o
Button
odcieniu. Tak więc innym sposobem dostosowania koloru tła przycisku jest użyciebackgroundTint
atrybutu.Na przykład,
źródło
Aby obsługiwać kolorowe przyciski, użyj najnowszej biblioteki AppCompat (> 23.2.1 ) z:
AppCompat Widget:
Styl AppCompat:
NB! Aby ustawić niestandardowy kolor w xml: użyj attr:
app
zamiastandroid
(użyj
alt+enter
lub zadeklarujxmlns:app="http://schemas.android.com/apk/res-auto"
użycieapp
)aplikacja : backgroundTint = "@ color / your_custom_color"
Przykład:
źródło
Z najnowszej biblioteki Wsparcia można po prostu odziedziczyć ci od aktywności
AppCompatActivity
, więc będzie nadmuchać swójButton
jakAppCompatButton
i okazją do KOLOR każdego pojedynczego przycisku na układ, który z korzystaniem zandroid:theme="@style/SomeButtonStyle"
, którymSomeButtonStyle
jest:Pracowałem dla mnie w 2.3.7, 4.4.1, 5.0.2
źródło
android:theme
a niestyle
. Możesz także dodaćcolorControlHighlight
icolorControlActivated
.Theme.AppCompat.Light
zamiast tego.jeśli chcesz poniżej stylu
dodaj ten styl do swojego przycisku
jeśli chcesz tego stylu
dodaj poniższy kod
źródło
compile 'com.android.support:appcompat-v7:23.1.0'
Musisz dodać.Odpowiedź brzmi: TEMAT, a nie styl
Problem polega na tym, że kolor przycisku jest przyklejony do colorButtonNormal motywu. Próbowałem zmienić Styl na wiele różnych sposobów bez powodzenia. Więc zmieniłem motyw przycisku .
Utwórz motyw z colorButtonNormal i colorPrimary:
Użyj tego motywu w przycisku
„AppTheme.Button” może dowolnie rozszerzać styl przycisku, tak jak tutaj Używam podstawowego koloru dla koloru tekstu:
I dostaniesz przycisk w dowolnym kolorze, który chcesz zgodny z materiałem.
źródło
Właśnie utworzyłem bibliotekę Androida, która pozwala łatwo modyfikować kolor przycisku i kolor tętnienia
https://github.com/xgc1986/RippleButton
Nie trzeba tworzyć stylu dla każdego przycisku, który ma mieć inny kolor, co pozwala na losowe dostosowanie kolorów
źródło
to działa dla mnie z appcompat-v7: 22.2.0 w Androidzie + 4.0
w twoim styles.xml
w pliku układu
źródło
Układ:
styles.xml:
color / button_background_selector.xml:
color / button_text_selector.xml:
źródło
Dla tych, którzy używają
ImageButton
tutaj, możesz to zrobić:W style.xml:
w v21 / style.xml:
Następnie w pliku układu:
źródło
Jeśli używasz rozwiązania stylu z colorButtonNormal , nie zapomnij odziedziczyć po Widget.AppCompat.Button.Colored aby efekt działał;)
Lubić
źródło
Kolejne proste rozwiązanie z wykorzystaniem AppCompatButton
źródło
Posługiwać się:
Lub nawet :
i to da niestandardowy kolor przyciskowi.
źródło
Jeśli chcesz tylko przycisk „Płaski” materiał, możesz dostosować jego tło za pomocą atrybutu selectableItemBackground, jak wyjaśniono tutaj .
źródło
Aby zmienić kolor jednego przycisku
źródło
Dla mnie problem polegał na tym, że w Androidzie 5.0
android:colorButtonNormal
nie miał żadnego efektu, a właściwie żaden element z motywu (jakandroid:colorAccent
), ale na przykład w Androidzie 4.4.3. Projekt został skonfigurowanycompileSdkVersion
itargetSdkVersion
do 22, więc zrobiłem wszystkie zmiany jako @Muhammad Alfaifi sugessted, ale w końcu, Zauważyłem, że problem był buildToolsVersion , który nie został zaktualizowany. Po zmianie na 23.0.1 wszystko zaczyna działać prawie jak zwykle. Terazandroid:colorButtonNormal
nadal nie ma efektu, ale przynajmniej przycisk reagujeandroid:colorAccent
, co jest dla mnie dopuszczalne.Mam nadzieję, że ta wskazówka może komuś pomóc. Uwaga: zastosowałem styl bezpośrednio do przycisku, ponieważ przyciski
android:theme=[...]
również nie działały.źródło
Jeden ze sposobów, aby to zrobić, pozwala po prostu wskazać styl i NIE motywować WSZYSTKICH przycisków w aplikacji tak samo.
W themes.xml dodaj motyw
Teraz dodaj do styles.xml
Teraz w swoim układzie po prostu wskaż STYL w Przycisku
źródło
AKTUALIZACJA
Użyj biblioteki obsługi projektu (23.2.0) i widżetów aplikacji, jak poniżej
W bibliotece pomocy technicznej Androida 22.1 :
Pełna lista widżetów uwzględniających odcień:
Projekt materiału dla urządzeń sprzed wersji Lollipop :
źródło
Jeśli chcesz używać stylu AppCompat , takiego jak Widget.AppCompat.Button , Base.Widget.AppCompat.Button.Colored itp., Musisz użyć tych stylów z kompatybilnymi widokami z biblioteki wsparcia.
Poniższy kod nie działa na urządzeniach z wersją wcześniejszą niż Lolipop:
Aby włączyć style AppCompat, musisz użyć AppCompatButton:
źródło
ImageView
zostanie zastąpionyAppCompatImageView
i powinien być taki sam dla wszystkich widżetów, które mają odpowiedniąAppCompat
wersję.android.support.v7.widget.AppCompatImageView
jawnie zdefiniować .last target version
@power?Używam tego. Działa efekt marszczenia i cień przycisku kliknięcia.
style.xml
Przycisk układu:
źródło
Właściwie nie chciałem zmieniać niestandardowych stylów przycisków, ale niestety już nie działały.
Moja aplikacja ma minSdkVersion 9 i wszystko działało wcześniej.
Nie wiem dlaczego, ale odkąd usunąłem Androida: przed przyciskiem Style wydaje się, że znów działa
teraz = działa:
<item name="buttonStyle">@style/ButtonmyTime</item>
before = tylko szare przyciski materiałowe:
<item name="android:buttonStyle">@style/ButtonmyTime</item>
Nie mam folderu spezial dla nowej wersji Androida, ponieważ moje przyciski są dość płaskie i powinny wyglądać tak samo we wszystkich wersjach Androida.
Może ktoś może mi powiedzieć, dlaczego musiałem usunąć „Androida:” ImageButton nadal działa z „Androidem”:
źródło
Po 2 dniach szukania odpowiedzi, temat przycisku nie działał dla mnie w API <21.
Moim jedynym rozwiązaniem jest zastąpienie barwienia AppCompatButton nie tylko za pomocą podstawowego motywu aplikacji „colorButtonNormal”, ale także widoku tła.
Następnie możesz zdefiniować kolor przycisku w następujący sposób:
źródło
Ta odpowiedź SO pomogła mi dojść do odpowiedzi https://stackoverflow.com/a/30277424/3075340
Korzystam z tej metody narzędzia, aby ustawić odcień tła przycisku. Działa z urządzeniami sprzed wersji Lollipop:
Jak używać w kodzie:
W ten sposób nie musisz określać ColorStateList, jeśli chcesz tylko zmienić odcień tła i nic więcej poza utrzymaniem ładnych efektów przycisków, a co nie.
źródło
Ustawiłem
android:textColor
na@null
moim przycisku tematu i to pomaga.styles.xml
some_layout.xml
Teraz kolor tekstu przycisku jest
colorAccent
zdefiniowany wAppTheme
źródło
jeśli używasz kotlin, możesz zobaczyć, że obsługiwane są wszystkie atrybuty z MaterialButton. Nie używaj atrybutu android: tło. MaterialButton zarządza własnym tłem do rysowania, a ustawienie nowego tła oznacza, że kolor wyłączonego przycisku Materiał nie może dłużej gwarantować, że nowe atrybuty, które wprowadzi, będą działały poprawnie. Jeśli domyślne tło zostanie zmienione, przycisk Materiał nie może zagwarantować dobrze zdefiniowanego zachowania. W MainActivity.kt
At Activity_main.xml
zasób: Przykład zmiany koloru przycisku materiału
źródło
jeśli chcesz to zrobić za pomocą kodu w dowolnym kolorze, użyj tego:
źródło