Wie können Sie den Ereignis-Listener für einen Spinner einstellen, wenn sich das ausgewählte Element ändert?
Grundsätzlich versuche ich etwas Ähnliches zu tun:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
android
events
spinner
android-spinner
Soni Ali
quelle
quelle
Antworten:
Einige der vorherigen Antworten sind nicht korrekt. Sie funktionieren für andere Widgets und Ansichten, aber in der Dokumentation für das Spinner-Widget heißt es eindeutig:
Verwenden Sie stattdessen besser OnItemSelectedListener () :
Das funktioniert bei mir.
Beachten Sie, dass die onItemSelected-Methode auch beim Erstellen der Ansicht aufgerufen wird, sodass Sie sie in den
onCreate()
Methodenaufruf einfügen können .quelle
onItemSelected(...)
wird nicht getroffen. (Ich weiß, weil ich das gerade auf die harte Tour herausgefunden habe.)Hinweis: Denken Sie an eine Sache.
Das Spinner-
OnItemSelectedListener
Event wird zweimal ausgeführt:Versuchen Sie, diese beiden mithilfe der Flag-Variablen zu unterscheiden.
quelle
Sie können eine
AdapterView.OnItemSelectedListener
Klasse in Ihrer Aktivität implementieren .Und dann verwenden Sie die folgende Zeile innerhalb
onCreate()
Überschreiben Sie dann diese beiden Methoden:
quelle
https://stackoverflow.com/q/1714426/811625
Sie können vermeiden, dass OnItemSelectedListener () mit einer einfachen Prüfung aufgerufen wird: Speichern Sie den aktuellen Auswahlindex in einer Ganzzahlvariablen und prüfen Sie ihn in onItemSelected (..), bevor Sie etwas unternehmen.
Z.B:
Natürlich
iCurrentSelection
sollte das im Objektbereich sein, damit dies funktioniert!quelle
iCurrentSelection
Variable innerhalb dieser anonymen Klasse deklariert ist, funktioniert sie einwandfrei. Sie können es auf -1 initialisieren, damit der Code beim ersten Aufruf ausgeführt wird.Suchen Sie Ihren Spinnernamen und Ihre ID und implementieren Sie diese Methode.
quelle
Es spielt keine Rolle, ob Sie OnItemSelectedListener in onCreate oder onStart festlegen - es wird weiterhin während der Erstellung oder des Starts der Aktivität aufgerufen.
Also können wir es in onCreate einstellen (und NICHT in onStart!).
Fügen Sie einfach ein Flag hinzu, um die erste Initialisierung herauszufinden:
dann in onCreate (oder onCreateView) einfach:
quelle
In den Dokumenten für das Spinner-Widget heißt es
Sie sollten verwenden
setOnItemSelectedListener
, um Ihr Problem zu behandeln.quelle
quelle
Nehmen Sie eine globale Variable für die aktuelle Auswahl des Spinners:
quelle
Wenn Sie einen echten onChangedListener () wollen. Speichern Sie den Anfangswert im Handler und prüfen Sie, ob er sich geändert hat. Es ist einfach und erfordert keine globale Variable. Funktioniert, wenn Sie mehr als einen Spinner auf der Seite haben.
...
Objekte sind dein Freund, benutze sie.
quelle
quelle
Dies funktioniert, initialisiert den Spinner und findviewbyid und verwendet dies, es wird funktionieren
quelle
Der beste Weg , was ich denke , wäre ein haben ,
flagitemselected = 0;
inonCreate()
. Und auf dem ausgewählten Elementelement erhöhen Sie dieses Flag, dhflagitemselected++
; und dann überprüfenDas wird mir wohl helfen.
quelle
Ein Trick, den ich gefunden habe, war das Einfügen Ihrer setOnItemSelectedListeners in onWindowFocusChanged anstelle von onCreate. Ich habe noch keine schlimmen Nebenwirkungen auf diese Weise gefunden. Richten Sie die Listener grundsätzlich ein, nachdem das Fenster gezeichnet wurde. Ich bin nicht sicher, wie oft onWindowFocusChanged ausgeführt wird, aber es ist einfach genug, sich eine Sperrvariable zu erstellen, wenn Sie feststellen, dass sie zu oft ausgeführt wird.
Ich denke, Android verwendet möglicherweise ein nachrichtenbasiertes Verarbeitungssystem. Wenn Sie alles in onCreate einfügen, kann es vorkommen, dass der Spinner nach dem Zeichnen gefüllt wird. Ihr Listener wird also ausgelöst, nachdem Sie den Speicherort festgelegt haben. Dies ist natürlich eine fundierte Vermutung, aber Sie können mich gerne korrigieren.
quelle
Standardmäßig erhalten Sie das erste Element des Spinner-Arrays durch
Wenn Sie den Wert im Drehfeld ausgewählt haben, erhalten Sie den ausgewählten Wert
Wenn Sie die Position des ausgewählten Elements möchten, machen Sie es so
Die beiden oben genannten Antworten gelten ohne Anwendung des Hörers
quelle