W nowej bibliotece AppCompat możemy zabarwić przycisk w ten sposób:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/follow"
android:id="@+id/button_follow"
android:backgroundTint="@color/blue_100"
/>
Jak mogę programowo ustawić odcień przycisku w moim kodzie? Zasadniczo próbuję zaimplementować warunkowe kolorowanie przycisku na podstawie danych wejściowych użytkownika.
android
android-appcompat
Stephane
źródło
źródło
Odpowiedzi:
Zgodnie z dokumentacją powiązaną metodą
android:backgroundTint
jest setBackgroundTintList (lista ColorStateList)Aktualizacja
Skorzystaj z tego łącza, aby dowiedzieć się, jak utworzyć zasób listy stanów kolorów.
następnie załaduj go za pomocą
gdzie
contextInstance
jest wystąpieniemContext
przy użyciu AppCompart
źródło
ViewCompat.setBackgroundTintList(View, ColorStateList)
może być używany aż do API 4. Ale działa tylko dla widoków, które implementująTintableBackgroundView
na przykładAppCompatButton
(zamiast zwykłychButton
).ViewCompat.setBackgroundTintList(View, ColorStateList)
, jak zasugerował @Jon Adams, ma jeszcze większy sens, ponieważ View.setSupportButtonTintList jest ograniczone doRestrictTo
adnotacji. Szczegóły tutaj: developer.android.com/reference/android/support/annotation/…Możesz użyć
Ale poleciłbym ci skorzystanie z biblioteki obsługi barwienia do rysowania, która właśnie została wydana wczoraj:
Więcej informacji można znaleźć w tym poście na blogu (patrz sekcja „Barwienie do rysowania”)
źródło
Wygląda na to, że widoki mają własną mechanikę zarządzania odcieniami, więc lepiej będzie umieścić listę odcieni:
źródło
W poprawnym rozszerzeniu odpowiedzi dimsuza przez podanie rzeczywistej sytuacji w kodzie, zobacz następujący fragment kodu:
To rozwiązanie jest dla scenariusza, w którym element rysunkowy jest używany jako tło przycisku. Działa również na urządzeniach sprzed wersji Lollipop.
źródło
Czy próbowałeś czegoś takiego?
pamiętaj, że getResources () będzie działać tylko w działaniu. Ale można go również wywołać w każdym kontekście.
źródło
oto jak to zrobić w kotlinie:
źródło
Możesz użyć DrawableCompat np
źródło
można to łatwo obsłużyć w nowym przycisku Material z biblioteki Material Design, najpierw dodaj zależność:
następnie w swoim kodzie XML użyj tego jako przycisku:
a jeśli chcesz zmienić kolor, oto kod w Kotlinie, nie jest przestarzały i można go używać przed Androidem 21:
źródło
Mój sposób, w jaki udało mi się zmusić do pracy, polegał na użyciu
CompoundButtonCompat.setButtonTintList(button, colour)
.W moim rozumieniu działa to niezależnie od wersji Androida.
źródło
Miałem podobny problem. Chciałem pokolorować złożone, możliwe do rysowania tło dla widoku na podstawie wartości koloru (int). Udało mi się, używając kodu:
Gdzie kolor jest wartością int reprezentującą wymagany kolor. To reprezentuje prostą xml ColorStateList:
Mam nadzieję że to pomoże.
źródło
ColorStateList.valueOf(ColorInt)
W przypadku ImageButton możesz użyć:
źródło
Jeśli używasz
Kotlin
iMaterial Design
, możesz zmienić kolor swojego wMaterialButton
ten sposób:Możesz to ulepszyć jeszcze lepiej, tworząc funkcję rozszerzenia dla swojego
MaterialButton
kodu, aby kod był bardziej czytelny, a kodowanie trochę wygodniejsze:Następnie możesz używać swojej funkcji wszędzie w ten sposób:
źródło
Oprócz odpowiedzi Shayne3000 możesz również użyć zasobu koloru (nie tylko int color). Wersja Kotlin :
źródło
Sugerowana odpowiedź tutaj nie działa poprawnie w systemie Android 5.0, jeśli lista stanów kolorów oparta na XML odwołuje się do atrybutów tematycznych. Na przykład mam listę stanów kolorów XML, taką jak ta:
Używanie tego jako mojego backgroundTint z xml działa dobrze na Androidzie 5.0 i wszystkim innym. Jeśli jednak spróbuję ustawić to w kodzie w ten sposób:
(Nie rób tego)
Właściwie nie ma znaczenia, czy przekażę Activity lub kontekst przycisku do metody ContextCompat.getColorStateList (), ani nie poda mi właściwej listy stanów kolorów w odniesieniu do motywu, w którym znajduje się przycisk. Dzieje się tak, ponieważ używanie atrybutów motywu na listach stanu kolorów nie było obsługiwane przed api 23, a ContextCompat nie robi nic specjalnego, aby je rozwiązać. Zamiast tego należy użyć AppCompatResources.getColorStateList (), która wykonuje własne analizowanie zasobów / rozpoznawanie atrybutów motywu na urządzeniach <API 23.
Zamiast tego musisz użyć tego:
TLDR: użyj AppCompatResources, a nie -ContextCompat-, jeśli potrzebujesz rozwiązanych zasobów tematycznych we wszystkich wersjach interfejsu API Androida.
Więcej informacji na ten temat znajdziesz w tym artykule .
źródło