Jak ustawić detektor zdarzeń dla pokrętła, gdy zmienia się wybrany element?
Zasadniczo próbuję zrobić coś podobnego do tego:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
android
events
spinner
android-spinner
Soni Ali
źródło
źródło
Odpowiedzi:
Niektóre z poprzednich odpowiedzi są nieprawidłowe. Działają w przypadku innych widżetów i widoków, ale dokumentacja widżetu Spinner wyraźnie stwierdza:
Lepiej użyj zamiast tego OnItemSelectedListener () :
To działa dla mnie.
Zauważ, że metoda onItemSelected jest również wywoływana podczas budowania widoku, więc możesz rozważyć umieszczenie go w
onCreate()
wywołaniu metody.źródło
onItemSelected(...)
nie jest trafiony. (Wiem, bo właśnie dowiedziałem się tego naUwaga: pamiętaj o jednej rzeczy.
OnItemSelectedListener
Event Spinner zostanie wykonany dwukrotnie:Spróbuj rozróżnić te dwa, używając zmiennej flag.
źródło
Możesz zaimplementować
AdapterView.OnItemSelectedListener
zajęcia w swojej działalności.A następnie użyj poniższej linii
onCreate()
Następnie zastąp te dwie metody:
źródło
https://stackoverflow.com/q/1714426/811625
Można uniknąć wywołania OnItemSelectedListener () za pomocą prostego sprawdzenia: Zachowaj bieżący indeks wyboru w zmiennej całkowitej i sprawdź w onItemSelected (..) zanim cokolwiek zrobisz.
Na przykład:
Przyczyna
iCurrentSelection
powinna być w zakresie obiektowym, aby to działało!źródło
iCurrentSelection
zmienna zostanie zadeklarowana w tej anonimowej klasie, będzie działać dobrze. Możesz zainicjować go na -1, aby kod był wykonywany przy pierwszym wywołaniu.Znajdź nazwę przędzarki i znajdź identyfikator, a następnie zastosuj tę metodę.
źródło
Nie ma znaczenia, czy ustawisz OnItemSelectedListener w onCreate czy onStart - będzie on nadal wywoływany podczas tworzenia lub uruchamiania działania (odpowiednio).
Możemy więc ustawić go w onCreate (a NIE w onStart!).
Wystarczy dodać flagę, aby wymyślić pierwszą inicjalizację:
następnie w onCreate (lub onCreateView) wystarczy:
źródło
Dokumenty dotyczące widżetu typu spinner mówią
Powinieneś użyć,
setOnItemSelectedListener
aby poradzić sobie z problemem.źródło
źródło
weź zmienną globalną dla bieżącego wyboru pokrętła:
źródło
Jeśli chcesz true onChangedListener (). Zapisz wartość początkową w module obsługi i sprawdź, czy uległa zmianie. Jest prosty i nie wymaga zmiennej globalnej. Działa, jeśli na stronie znajduje się więcej niż jedna przędzarka.
...
Przedmioty są twoim przyjacielem, używaj ich.
źródło
źródło
To zadziała, zainicjalizuj pokrętło i znajdź viewbyid i użyj tego, to zadziała
źródło
Najlepszym sposobem, co myślę, że byłoby mieć
flagitemselected = 0;
inonCreate()
. I na wybranej pozycji zdarzeń przyrostu że flagi IEflagitemselected++
; a następnie sprawdźTo chyba pomoże.
źródło
Jedną sztuczką, którą znalazłem, było umieszczenie twoich setOnItemSelectedListeners w onWindowFocusChanged zamiast onCreate. Nie znalazłem jeszcze żadnych złych skutków ubocznych, aby robić to w ten sposób. Zasadniczo skonfiguruj detektory po narysowaniu okna. Nie jestem pewien, jak często działa onWindowFocusChanged, ale łatwo jest stworzyć sobie zmienną blokującą, jeśli okaże się, że działa zbyt często.
Myślę, że Android może korzystać z systemu przetwarzania opartego na wiadomościach, a jeśli włożysz to wszystko do programu onCreate, możesz napotkać sytuacje, w których błystka zostanie zapełniona po jej wyciągnięciu. Twój słuchacz odpali po ustawieniu lokalizacji przedmiotu. Jest to oczywiście wykształcone przypuszczenie, ale możesz mnie poprawić w tej kwestii.
źródło
Domyślnie otrzymasz pierwszy element tablicy przędzarki
za każdym razem, gdy wybierzesz wartość w pokrętle, otrzymasz wybraną wartość
jeśli chcesz pozycję wybranego elementu, zrób to w ten sposób
powyższe dwie odpowiedzi dotyczą bez zastosowania detektora
źródło