Próbuję zmienić kolor tła TextView
widżetu Androida, gdy użytkownik go dotknie. W tym celu stworzyłem selektor, który jest przechowywany w res/color/selector.xml
i z grubsza wygląda tak:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:color="@color/semitransparent_white"
/>
<item
android:color="@color/transparent"
/>
</selector>
clickable
Atrybutem TextView
jest true
w przypadku, który jest przedmiotem zainteresowania.
Kiedy przypisuję ten selektor do TextView
as android:background="@color/selector"
, otrzymuję następujący wyjątek w czasie wykonywania:
BŁĄD / AndroidRuntime (13130): spowodowane przez: org.xmlpull.v1.XmlPullParserException: binarny wiersz pliku XML nr 6: tag wymaga atrybutu „drawable” lub tagu podrzędnego definiującego element do rysowania
Kiedy zmieniam atrybut na rysowalny, działa, ale wynik wygląda zupełnie nieprawidłowo, ponieważ identyfikatory wydają się być interpretowane jako odniesienia do obrazu, a nie odniesienia do kolorów (jak sugeruje element „do rysowania”).
Wprawia mnie w zakłopotanie, że mogę bezpośrednio ustawić odniesienie koloru, np. „@ Kolor / czarny”, jako atrybut tła. To działa zgodnie z oczekiwaniami. Używanie selektorów nie działa.
Z selektora też mogę korzystać textColor
bez problemów.
Jaki jest prawidłowy sposób zastosowania selektora koloru tła TextView
w systemie Android?
Odpowiedzi:
Problem polega na tym, że nie możesz zdefiniować koloru tła za pomocą selektora kolorów, potrzebujesz selektora z możliwością rysowania . Tak więc niezbędne zmiany wyglądałyby następująco:
Musisz również przenieść ten zasób do
drawable
katalogu, w którym miałoby to większy sens, ponieważ nie jest to selektor kolorów jako taki.Następnie musiałbyś utworzyć taki
res/drawable/selected_state.xml
plik:i na koniec użyłbyś tego w ten sposób:
Uwaga : powodem, dla którego OP pobierał zasób obrazu, jest prawdopodobnie to, że próbował po prostu odwołać się do swojego zasobu, który nadal był w katalogu kolorów, ale używał,
@drawable
więc skończył się kolizją identyfikatorów, wybierając niewłaściwy zasób.Mam nadzieję, że to nadal może komuś pomóc, nawet jeśli OP prawdopodobnie już, mam nadzieję, rozwiązał swój problem.
źródło
Rozwiązanie Benoit działa, ale tak naprawdę nie musisz ponosić kosztów ogólnych, aby narysować kształt. Ponieważ kolory mogą być rysowalne, po prostu zdefiniuj kolor w pliku /res/values/colors.xml:
Następnie użyj jako takiego w swoim selektorze:
źródło
Jeszcze prostsze rozwiązanie powyższego:
Zapisz to w folderze do rysowania i gotowe.
źródło
<item android:state_pressed="true" android:color="@color/vantablack"/>
wygląda semantycznie identycznie do<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
Nawet to działa.
Dodałem
android:drawable
atrybut do każdej pozycji, a ich wartościami są kolory.Nawiasem mówiąc, dlaczego mówią, że
color
jest to jeden z atrybutówselector
? Nie piszą, żeandroid:drawable
jest to wymagane.Zasób listy stanów kolorów
źródło
Kto szuka, aby to zrobić bez tworzenia sektora w tle, po prostu dodaj te linie do
TextView
Aby go również użyć do wyboru:
źródło