Zacząłem więc używać nowego Snackbar w bibliotece Design Support Library, ale odkryłem, że kiedy definiujesz „android: textColor” w swoim motywie, dotyczy to koloru tekstu paska przekąskowego. Jest to oczywiście problem, jeśli podstawowy kolor tekstu jest ciemny.
Czy ktoś wie, jak to obejść lub ma radę, jak pokolorować tekst?
EDYCJA Styczeń 2017: (Po odpowiedzi)
Chociaż istnieje kilka niestandardowych rozwiązań, które rozwiązują ten problem poniżej, prawdopodobnie dobrze jest zapewnić właściwy sposób tworzenia motywów barów przekąskowych.
Po pierwsze, prawdopodobnie nie powinieneś w ogóle definiować android:textColor
w swoich motywach (chyba że naprawdę znasz zakres tego, czego używa motyw). To ustawia kolor tekstu w zasadzie każdego widoku, który łączy się z Twoim motywem. Jeśli chcesz zdefiniować kolory tekstu w widokach, które nie są domyślne, użyj android:primaryTextColor
tego atrybutu i odwołaj się do niego w widokach niestandardowych.
Jednak aby zastosować motywy do Snackbar
, zapoznaj się z przewodnikiem dotyczącym jakości z dokumentu materiału strony trzeciej: http://www.materialdoc.com/snackbar/ (Postępuj zgodnie z implementacją motywu programowego, aby nie opierać się na stylu xml)
Na przykład:
// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);
// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));
// get snackbar view
View snackbarView = snackbar.getView();
// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);
textView.setTextColor(getResources().getColor(R.color.indigo));
// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);
(Możesz także tworzyć własne niestandardowe Snackbar
układy, zobacz powyższy link. Zrób to, jeśli ta metoda wydaje się zbyt hakerska i chcesz z pewnością niezawodny sposób, aby Twój niestandardowy Snackbar był ostatni dzięki możliwym aktualizacjom biblioteki wsparcia).
Alternatywnie, zapoznaj się z odpowiedziami poniżej, aby uzyskać podobne i być może szybsze odpowiedzi, aby rozwiązać problem.
android:textColorPrimary
Odpowiedzi:
Wiem, że już na to odpowiedziano, ale najłatwiejszy sposób, jaki znalazłem, był bezpośrednio w marce przy użyciu
Html.fromHtml
metody ifont
taguźródło
Znalazłem to na stronie Jakie są nowe funkcje biblioteki wsparcia projektowania Androida i jak używać jej paska przekąskowego?
Pomogło mi to w zmianie koloru tekstu w Snackbar.
AKTUALIZACJA: ANDROIDX: Jak wskazuje dblackker w komentarzach, dzięki nowej bibliotece obsługi AndroidX kod do znalezienia identyfikatora Snackbar TextView zmienia się na:
źródło
snackbar_action
zamiastsnackbar_text
. Zobacz tę odpowiedź jako przykład: stackoverflow.com/a/36800101/293280snack.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
Hakowanie
android.support.design.R.id.snackbar_text
jest delikatne, lepszym lub mniej hakerskim sposobem na to będzie:źródło
Utworzono tę funkcję rozszerzenia kotlin, której używam w moich projektach:
Sposób użycia, jakiego można się spodziewać:
źródło
com.google.android.material.R.id.snackbar_text
przypadku migracji do AndroidX.W porządku, więc naprawiłem to, zasadniczo zmieniając sposób, w jaki robię kolory tekstu.
W moim lekkiego tematu, ustawić
android:textColorPrimary
donormal dark text
chciałam, i ustawićandroid:textColor
nawhite
.Zaktualizowałem wszystkie widoki tekstu i przyciski, aby mieć
android:textColor="?android:attr/textColorPrimary".
Ponieważ pasek przekąsek czerpie z
textColor
, po prostu ustawiłem cały mój tekst natextColorPrimary
.EDYCJA STYCZNIA 2017: ---------------------------------------------- ------
Tak więc, jak mówią komentarze i jak stwierdzono w edytowanym oryginalnym pytaniu powyżej, prawdopodobnie nie powinieneś definiować
android:textColor
swoich motywów, ponieważ zmienia to kolor tekstu każdego widoku w motywie.źródło
android:textColor
swojego motywu. To atrybut styluTextView
. Jeśli zdefiniujesz go w swoim motywie , nadpisujesz kolor tekstu każdegoTextView
lubButton
nie określa koloru tekstu w XML. Tak się składa, że jest to również komunikat na pasku przekąskowym, który normalnie przybrałby kolor z powodu ciemnego motywu .Jedną z metod jest użycie przęseł:
Dzięki rozpiętości możesz również dodać kilka kolorów i stylów w jednym Snackbar. Oto fajny przewodnik:
https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/
źródło
Jeśli migrowałeś do androidX, użyj
com.google.android.material.R.id.snackbar_text
zamiastandroid.support.design.R.id.snackbar_text
zmieniać kolor tekstu na pasku przekąskowym .źródło
Jedyny sposób, w jaki widzę, to używanie
getView()
dziecka i poruszanie się po nim. Nie wiem, czy to zadziała, a na to wygląda. Mam nadzieję, że wkrótce dodadzą API dotyczące tego problemu.źródło
Jeśli przeprowadzisz migrację kodu do AndroidX, właściwość TextView ma teraz postać:
źródło
Tego właśnie używam, gdy potrzebuję niestandardowych kolorów
I spożywane jako:
źródło
Zmieniłem motyw
do
Udało się. Spróbuj użyć prostego motywu zamiast jasnego lub innego motywu.
źródło
Jeśli zdecydujesz się użyć brudnego i zhakowanego rozwiązania ze znajdowaniem TextView w Snackbar według identyfikatora i już migrowałeś do androidx, oto kod:
źródło
Możesz skorzystać z tej biblioteki: https://github.com/SandroMachado/restaurant
Zastrzeżenie: stworzyłem bibliotekę.
źródło
Funkcja Find by id nie działała, więc znalazłem inne rozwiązanie:
źródło
Użyj
Snackbar
dołączonego do Biblioteki komponentów materiałów i zastosujsetTextColor
do zdefiniowania koloru tekstusetActionTextColor
aby zdefiniować kolor tekstu używany przez akcję. Możesz użyć koloru lub selektora kolorówsetBackgroundTint
aby zdefiniować kolor tła SnackbarCoś jak:
źródło
Mam prosty kod, który pomoże uzyskać instancję zarówno widoku tekstu Snackbara, po czym możesz wywołać wszystkie metody, które mają zastosowanie w widoku tekstowym.
źródło
Aby zaoszczędzić Twój cenny czas na programowanie, oto metoda statyczna, której używam:
Tak to wygląda:
źródło
Jeśli jesteś w Kotlinie , możesz stworzyć rozszerzenie:
Zastosowanie :
źródło
Zgodnie z nowymi komponentami AndroidX Jitpack
Użyj tego rozszerzenia, które stworzyłem
Użyj tego w ten sposób
źródło
To jest moje obejście, aby rozwiązać tego typu problem podczas
androidx
używaniakotlin
Musisz zainicjować metodę
mContent
wewnętrznąonViewCreated
, jak poniżejźródło
Obecnie (styczeń 2020) z
com.google.android.material:material:1.2.0
i prawdopodobnie również1.1.0
To zdecydowanie najlepszy sposób, jak to zrobić, zastępując te style:
Jeśli z
.Bridge
jakiegoś powodu użyjesz motywu materiałowego z na końcu, żaden z tych stylów nie zostanie zdefiniowany. Dlatego Snackar użyje jakiegoś starszego układu bez tych stylów.Znalazłem w kodzie źródłowym, że oba
snackbarButtonStyle
isnackbarTextViewStyle
muszą być zdefiniowane, w przeciwnym razie nie będzie używane.źródło
Zauważyłem też ten sam problem. Dzięki odpowiedziom tutaj stworzyłem małą klasę, która może pomóc w rozwiązaniu tego problemu w łatwiejszy sposób, zastępując to:
z tym:
Oto moja klasa:
}
źródło