Chcę użyć Spinnera, który początkowo (gdy użytkownik jeszcze nie dokonał wyboru) wyświetla tekst „Wybierz jeden”. Gdy użytkownik kliknie pokrętło, wyświetlona zostanie lista elementów, a użytkownik wybierze jedną z opcji. Po dokonaniu wyboru przez użytkownika wybrany element jest wyświetlany w pokrętle zamiast „Wybierz jeden”.
Mam następujący kod, aby utworzyć Błystkę:
String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
Z tym kodem początkowo wyświetlany jest element „Jeden”. Mógłbym po prostu dodać nowy element „Wybierz jeden” do elementów, ale wtedy „Wybierz jeden” będzie również wyświetlany na liście rozwijanej jako pierwszy element, czego nie chcę.
Jak mogę rozwiązać ten problem?
android
android-spinner
Pieter Kuijpers
źródło
źródło
Odpowiedzi:
Oto ogólne rozwiązanie, które przesłania
Spinner
widok. ZastępujesetAdapter()
ustawienie pozycji początkowej na -1 i przekazujeSpinnerAdapter
podany parametr w celu wyświetlenia ciągu zachęty dla pozycji mniejszej niż 0.Zostało to przetestowane na Androidzie od 1.5 do 4.2, ale kupujący uważaj! Ponieważ to rozwiązanie opiera się na refleksji, aby wywołać funkcję prywatną,
AdapterView.setNextSelectedPositionInt()
iAdapterView.setSelectedPositionInt()
nie ma gwarancji, że będzie działać w przyszłych aktualizacjach systemu operacyjnego. Wydaje się prawdopodobne, że tak będzie, ale nie jest to w żaden sposób gwarantowane.Zwykle nie tolerowałbym czegoś takiego, ale zadawano to pytanie wystarczająco dużo razy i wydaje się to rozsądną prośbą, że myślałem, że opublikuję moje rozwiązanie.
źródło
Co możesz zrobić, to udekorować swój
SpinnerAdapter
pomocą tego, który przedstawia widok „Wybierz opcję ...” na początku, aby wyświetlał Spinner bez niczego zaznaczonego.Oto działający przykład przetestowany dla Androida 2.3 i 4.0 (nie używa niczego w bibliotece kompatybilności, więc powinno być na chwilę w porządku) Ponieważ jest dekoratorem, powinien być łatwy do ponownego zainstalowania istniejącego kodu i działa dobrze
CursorLoader
również z s. (Zamień kursor nacursorAdapter
oczywiście zawinięty ...)Istnieje błąd Androida, który sprawia, że nieco trudniej jest ponownie używać widoków. (Więc musisz użyć
setTag
lub czegoś innego, aby upewnić się, że maszconvertView
rację.) Spinner nie obsługuje wielu typów widokówUwagi do kodu: 2 konstruktory
Pozwala to na użycie standardowego monitu lub zdefiniowanie własnego „niczego nie wybranego” jako pierwszego wiersza lub obu tych elementów lub żadnego. (Uwaga: niektóre motywy pokazują DropDown dla Spinnera zamiast okna dialogowego. Lista rozwijana zwykle nie wyświetla monitu)
Definiujesz układ, aby wyglądał jak monit, na przykład wyszarzony ...
Za pomocą standardowego monitu (zauważ, że nic nie jest zaznaczone):
Lub z podpowiedzią i czymś dynamicznym (mógł nie mieć również podpowiedzi):
Zastosowanie w powyższym przykładzie
contact_spinner_row_nothing_selected.xml
NothingSelectedSpinnerAdapter.java
źródło
Skończyło się na tym
Button
zamiast. Podczas gdy aButton
nie jestSpinner
, zachowanie można łatwo dostosować.Najpierw utwórz adapter jak zwykle:
Zauważ, że używam
simple_spinner_dropdown_item
jako identyfikatora układu. Pomoże to stworzyć lepszy wygląd podczas tworzenia okna dialogowego alertu.W module obsługi onClick dla mojego przycisku mam:
I to wszystko!
źródło
Po pierwsze, możesz być zainteresowany
prompt
atrybutemSpinner
klasy. Zobacz poniższy obrazek: „Wybierz planetę” to monit, który można ustawić w pliku XML za pomocąandroid:prompt=""
.Chciałem zaproponować podklasę
Spinner
, w której można wewnętrznie utrzymywać dwa adaptery. Jeden adapter z opcją „Wybierz jeden”, a drugi prawdziwy adapter (z rzeczywistymi opcjami), a następnie za pomocą przyciskuOnClickListener
przełączaj adaptery przed wyświetleniem okna dialogowego opcji. Jednak po wypróbowaniu tego pomysłu doszedłem do wniosku, że nie można odbieraćOnClick
zdarzeń dla samego widżetu.Możesz owinąć pokrętło w innym widoku, przechwycić kliknięcia w widoku, a następnie poprosić
CustomSpinner
o zmianę adaptera, ale wydaje się to okropnym włamaniem.Czy naprawdę musisz pokazać „Wybierz jeden”?
źródło
Ten kod został przetestowany i działa na Androidzie 4.4
źródło
getItem(getCount())
jest dla mnie podkreślony na czerwono? Nie można rozwiązać metody setHintZnalazłem to rozwiązanie:
Wystarczy zmienić tablicę [0] za pomocą „Select One”, a następnie w onItemSelected zmienić nazwę na „One”.
Nie jest to klasyczne rozwiązanie, ale działa: D
źródło
Brak domyślnego interfejsu API do ustawiania podpowiedzi w programie Spinner. Aby go dodać, potrzebujemy małego obejścia bez implementacji refleksji bezpieczeństwa
Źródło adaptera:
Pierwotnym źródłem
źródło
android.R.id.text1
getCount
metodyTutaj jest wiele odpowiedzi, ale jestem zaskoczony, że nikt nie zaproponował prostego rozwiązania: umieść TextView na urządzeniu Spinner. Ustaw detektor kliknięć w TextView, który ukrywa TextView pokazuje Spinner i wywołuje spinner.performClick ().
źródło
Mam ten sam problem z przędzarką, z pustym wyborem i znalazłem lepsze rozwiązanie. Spójrz na ten prosty kod.
Tutaj spinneradapter jest małym dostosowaniem do arrayadapter. To wygląda tak:
źródło
Możesz zmienić go na widok tekstu i użyć tego:
a następnie zdefiniuj
android:text
właściwość.źródło
Plik XML:
Czynność:
onCreate:
Niektóre funkcje (programowo dodawaj elementy do adaptera)>
Teraz masz pustą przędzarkę i możesz pisać kod, aby nie otwierać okna dialogowego, jeśli jest puste. Lub mogą cofnąć. Ale wypełniasz ją również funkcją lub inną listą w czasie wykonywania.
źródło
Próbowałem następująco. Weź przycisk i nadaj mu zdarzenie click. Zmieniając tło przycisku, wydaje się być pokrętłem.
Deklaruj jako globalne zmienne alertdialog i wartość domyślną.
źródło
To jest mój sposób:
źródło
Rzuć okiem na iosched app, która stanowi rozwiązanie ogólnego zastosowania polegające na dodawaniu elementu na początek listy. W szczególności, jeśli używasz CursorAdapter, spójrz na TracksAdapter.java który rozszerza tę definicję, aby zapewnić metodę „setHasAllItem” i powiązany kod do zarządzania liczbą list, aby poradzić sobie z dodatkową pozycją na górze.
Za pomocą niestandardowego adaptera możesz ustawić tekst na „Wybierz jeden” lub cokolwiek innego, co chcesz powiedzieć o tym górnym elemencie.
źródło
Mam plik spinner na moim pliku main.xml, którego identyfikator to
@+id/spinner1
oto co piszę w mojej funkcji OnCreate:
Nie wymaga żadnej implementacji w klasie.
źródło
Znalazłem wiele dobrych rozwiązań w tym zakresie. większość działa, dodając element na końcu adaptera i nie wyświetlając ostatniego elementu na liście rozwijanej. Dużym problemem dla mnie było to, że rozwijana lista spinnerów zacznie się od dołu listy. Tak więc użytkownik widzi ostatnie przedmioty zamiast pierwszych (w przypadku wielu przedmiotów do pokazania), po pierwszym dotknięciu pokrętła.
Więc umieszczam wskazówkę na początku listy. i ukryj pierwszy element na liście rozwijanej.
ustaw poniższy układ w @Override getDropDownView (), gdy pozycja wynosi 0, aby ukryć pierwszy wiersz podpowiedzi.
R.layout.spinner_hint_list_item_layout:
źródło
Ponadto istnieje prosta sztuczka, aby wyświetlić domyślne:
Możesz dodać wartość domyślną do listy, a następnie dodać całą swoją kolekcję za pomocą
list.addAll(yourCollection);
Przykładowy działający kod tutaj:
Mam nadzieję, że odzyskasz swoją złożoność. Miłego kodowania!
źródło
Myślę, że najłatwiejszym sposobem jest utworzenie fikcyjnego elementu w indeksie 0, mówiąc „wybierz jeden”, a następnie zapisując, może sprawdź, czy wybór nie jest równy 0.
źródło
To jest mój ostatni przykład „wszystko w” dla pokrętła
W Activity_my_form.xml
W strings.xml
W MyFormActivity.java
W końcu otrzymałem konfigurowalny rozmiar czcionki, nie można wybierać pierwszego elementu pokrętła !!! Dzięki HRJ
źródło
Rozszerzając
SpinnerAdapter
, zastępujeszView
metody dwuprodukcyjnegetView(int, View, ViewGroup)
igetDropDownView(int, View, ViewGroup)
. Pierwszy zasilaView
wstawiony wSpinner
siebie; drugi zawieraView
listę rozwijaną (jak sama nazwa wskazuje). Możesz zastąpić to,getView(...)
aby do momentu wybrania elementu wyświetlałTextView
monit zawierający; następnie, gdy wykryjesz, że element został wybrany, zmieniasz go, aby wyświetlaćTextView
odpowiadający temu element .źródło
Spinner
samouczkiem (który rzekomo wyświetlaToast
PO, gdy wybrałeś element) ten OUGHT do pracy: developer.android.com/resources/tutorials/views/…Dla tych, którzy używają Xamarin, tutaj jest C # odpowiednik powyższej odpowiedzi aaronvargas.
źródło
Rozwiązałem również ten problem, używając następującego kodu. Załóżmy, że masz listę przedmiotów, np
Teraz musimy dostarczyć struny do przędzarki, ponieważ przędzarka nie może zrozumieć obiektu. Stworzymy więc nową listę tablic z takimi ciągami znaków jak ta ->
Teraz mamy
itemStringArrayList
listę tablic z dwoma elementami łańcucha. I musimy pokazać tekst „Wybierz element” jako pierwszy element. Więc musimy wstawić nowy ciąg doitemStringArrayList
.Teraz mamy listę tablic
itemsArrayList
i chcemy pokazać dwa elementy w menu rozwijanym. Ale warunkiem jest tutaj ... Jeśli niczego nie wybieramy, to wtedySelect Item
powinien pojawić się jako pierwszy element, który nie zostanie włączony.Możemy więc zaimplementować tę funkcjonalność w ten sposób. Jeśli musisz załadować elementy listy tablic do tarczy Android. Będziesz musiał użyć adaptera. Więc tutaj użyję
ArrayAdapter
. Możemy również użyć dostosowanego adaptera.Tutaj w tym kodzie. korzystamy z niestandardowego układu tarczy, tj
R.layout.spinner_item
. To prosty widok tekstuMusimy wyłączyć pierwszy tekst w pokrętle. Więc dla pozycji 0 wyłączamy tekst. Kolor można również ustawić, zastępując metodę getDropDownView. W ten sposób otrzymamy oczekiwany spinner.
źródło
Po prostu użyłbym RadioGroup z RadioButtons, jeśli masz tylko trzy opcje, możesz odznaczać je wszystkie na początku.
źródło
Żadna z wcześniej przesłanych odpowiedzi nie działała tak, jak chciałem rozwiązać ten problem. Dla mnie idealnym rozwiązaniem byłoby „Wybierz jeden” (lub jakikolwiek inny tekst początkowy) przy pierwszym wyświetleniu pokrętła. Gdy użytkownik dotknie tarczy, tekst początkowy nie powinien być częścią wyświetlanego menu rozwijanego.
Aby jeszcze bardziej skomplikować moją szczególną sytuację, moje dane przędzarki pochodzą z kursora, który jest ładowany przez wywołania zwrotne LoaderManager.
Po znacznych eksperymentach wymyśliłem następujące rozwiązanie:
źródło
Poradzę sobie z tym za pomocą przycisku zamiast pokrętła. Mam przykładowy projekt na GitHub.
W projekcie wyświetlam zarówno pokrętło, jak i przycisk, aby pokazać, że rzeczywiście wyglądają identycznie. Z wyjątkiem przycisku możesz ustawić tekst początkowy na cokolwiek chcesz.
Oto jak wygląda aktywność:
UWAGA: Tak, zdaję sobie sprawę, że zależy to od zastosowanego motywu, a wygląd będzie nieco inny, jeśli użyjesz motywu Theme.Holo. Jeśli jednak używasz jednego ze starszych motywów, takiego jak Theme.Black, możesz zacząć.
źródło
jeśli napotykasz ten problem, gdy elementy są wypełniane kursorem bazy danych ,
najprostsze rozwiązanie, które znalazłem w tej SO odpowiedzi:
użyj UNION w zapytaniu adaptera kursora i dodaj dodatkowy element o id = -1 do wyniku zapytania, tak naprawdę nie dodając go do DB:
coś jak:
jeśli wybrany element to -1, to jest to wartość domyślna. W przeciwnym razie jest to zapis ze stołu.
źródło
Wydaje się to banalnym rozwiązaniem, ale zwykle umieszczam po prostu TextView na przedniej części tarczy. Cały Xml wygląda tak. (hej, nie strzelajcie do mnie, wiem, że niektórym z was nie podoba się tego rodzaju małżeństwo):
Następnie ukrywam TextView, gdy element został wybrany. Oczywiście kolor tła TextView powinien być taki sam jak Spinner. Działa na Androidzie 4.0. Nie wiem o starszych wersjach.
Tak. Ponieważ Spinner wywołuje na początku setOnItemSelectedListener, ukrywanie widoku tekstu może być nieco trudne, ale można to zrobić w ten sposób:
źródło
dla mnie zadziałało coś takiego. ma ulepszenie, które zmienia tylko tekst w NIEKTÓRYCH opcjach, ale nie we wszystkich.
Najpierw biorę nazwy pokrętła i tworzę arrayadapter z dostosowanym widokiem, ale nie ma to teraz znaczenia, klucz zastępuje getView, a wewnątrz zmieniam wartości, które musisz zmienić. W moim przypadku był tylko pierwszy, resztę pozostawiam oryginał
źródło
tutaj jest prosty
źródło
Odwołaj się do jednej z powyższych odpowiedzi: https://stackoverflow.com/a/23005376/1312796
Dodałem swój kod, aby naprawić mały błąd. Tam, gdzie nie odzyskano żadnych danych .. Jak wyświetlić tekst zachęty ..!
Oto moja sztuczka ... Działa ze mną dobrze. !
Spróbuj umieścić swój spinner w Relative_layout i wyrównaj widok tekstowy ze swoim pokrętłem i graj z widocznością widoku tekstowego (POKAŻ / UKRYJ) za każdym razem, gdy adapter przędzarki jest załadowany lub pusty.
Oto kod:
wywołać tę metodę przed i przed załadowaniem i opróżnieniem adaptera przędzarki.
źródło