Android Spinner: Holen Sie sich das ausgewählte Elementänderungsereignis

Lesezeit: 5 Minuten

Android Spinner Holen Sie sich das ausgewahlte Elementanderungsereignis
Soni Ali

Wie können Sie den Ereignis-Listener für einen Spinner festlegen, wenn sich das ausgewählte Element ändert?

Im Grunde versuche ich etwas Ähnliches zu tun:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}

  • Ich habe diese Antworten versucht, aber niemand war hilfreich. Die Once-Spinner-Komponente unterstützt keine Elementklickereignisse. Spinner-Dokumentation

    Benutzer1470285

    20. Juni 2012 um 19:32 Uhr

Android Spinner Holen Sie sich das ausgewahlte Elementanderungsereignis
znq

Einige der vorherigen Antworten sind nicht richtig. Sie funktionieren für andere Widgets und Ansichten, aber die Dokumentation für die Spinner-Widget klar sagt:

Ein Spinner unterstützt keine Elementklickereignisse. Der Aufruf dieser Methode löst eine Ausnahme aus.

Besser verwenden OnItemSelectedListener() stattdessen:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }

});

Das funktioniert für mich.

Beachten Sie, dass die onItemSelected-Methode auch aufgerufen wird, wenn die Ansicht erstellt wird, sodass Sie erwägen können, sie darin zu platzieren onCreate() Methodenaufruf.

  • Das Problem dabei ist, dass die Methode onItemSelected auch aufgerufen wird, wenn die Ansicht erstellt wird. Der darin geschriebene Code wird also auch beim Start ausgeführt. Gibt es eine Möglichkeit, den enthaltenden Code nur auszuführen, wenn eine echte Elementauswahl vom Benutzer aufgerufen wird?

    – Kennethvr

    28. Dezember 2010 um 11:53 Uhr

  • Tatsächlich kann dieses Problem gelöst werden, indem setOnItemSelectedListener in die Override-OnStart-Methode und nicht in die onCreate-Methode eingefügt wird. ich Idiot…

    – Kennethvr

    28. Dezember 2010 um 12:05 Uhr

  • Ich habe den Listener in die onStart-Methode eingefügt, aber er wird aufgerufen, bevor der Benutzer überhaupt etwas zu sehen bekommt, genau wie onCreate, also in meinem Fall, wo eine “Fortfahren”-Schaltfläche unsichtbar sein soll, bis der Benutzer etwas auswählt, die Schaltfläche wird bei der anfänglichen Anzeige sichtbar gemacht. Sagen Sie, Ihre Erfahrung ist anders? Wenn ja, was machen Sie anders in der onStart-Methode, die ich vermisse?

    – Jewgeni Simkin

    28. Februar 2011 um 18:47 Uhr

  • Verwenden Sie ein anderes Feld in Ihrem anonymen Listener, um die erste Auswahl aufzuzeichnen, und weisen Sie onItemSelected an, nichts zu tun, es sei denn, eine Auswahl wurde getroffen? Nur ein Gedanke.

    – Sam Svenbjorgchristiensensen

    21. März 2011 um 9:34 Uhr

  • Aber was ist, wenn der Benutzer das „Standard“-Element auswählt, das oberste? Dann onItemSelected(...) wird nicht getroffen. (Ich weiß es, weil ich das gerade auf die harte Tour herausgefunden habe.)

    – Andreas Wyld

    23. März 2012 um 16:40 Uhr

1646321590 58 Android Spinner Holen Sie sich das ausgewahlte Elementanderungsereignis
Santhosh

Spinner spnLocale = (Spinner)findViewById(R.id.spnLocale);

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
        // Your code here
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

Notiz: Erinnere dich an eine Sache.

Spinner OnItemSelectedListener Ereignis wird zweimal ausgeführt:

  1. Spinner-Initialisierung
  2. Benutzer manuell ausgewählt

Versuchen Sie, diese beiden zu unterscheiden, indem Sie die Flag-Variable verwenden.

  • Meiner wird auch zweimal angerufen! Ich kann nicht verstehen, wie Sie zwischen den beiden unterscheiden?

    – MAC

    26. Juni 2010 um 0:09 Uhr

  • Setzen Sie einfach einen globalen booleschen Wert wie Boolean initialDisplay = true; Und dann sehen Sie in Ihrem onSelect, ob es wahr ist, und wenn ja, tun Sie nicht, was Sie sonst bei select tun wollten, sondern setzen Sie das Flag auf false, wenn es das nächste Mal aufgerufen wird (wenn der Benutzer tatsächlich auswählt).

    – Jewgeni Simkin

    28. Februar 2011 um 19:41 Uhr


  • Beste Erklärung zur Ausführung von OnclickListener.

    – Pankaj Kumar

    22. August 2011 um 10:37 Uhr

  • Ich persönlich bin entsetzt, dass etwas so Einfaches – ein so grundlegendes UI-Widget – so verdammt schwierig zu implementieren ist … im Ernst – wie schwierig wäre es, eine Eigenschaft „Standardanzeigeelement“ und die Boolesche Flag-Eigenschaft in das Objekt zu erstellen Klasse selbst?? Ich bin kein Fan von Objective C, aber ich werde sagen, dass die Implementierung von iOS-Widgets etwa 1/10 der Zeit dauert, die sie in Android benötigt.

    – Bennett von Bennett

    15. März 2012 um 0:58 Uhr


  • Ich stimme auch zu. Der Spinner ist ein verkorkstes Widget. Es ist sehr schwer zu wissen, wann das Popup oder Drop geöffnet oder geschlossen ist. Wäre es so schwer gewesen, eine Veranstaltung dafür hinzuzufügen? Die obige Lösung kann Ihnen FAST sagen, wann die Liste geöffnet oder geschlossen ist, hat aber drei Probleme: (1) es gibt kein Ereignis zum Auswählen des bereits ausgewählten Elements (und die Liste schließt sich) und (2) es gibt kein Ereignis zum Abbrechen (berühren off-list, um es zu schließen) und (3) onNothingSelected scheint für mich nie zu feuern.

    – Batdude

    1. Oktober 2013 um 22:03 Uhr

1646321591 909 Android Spinner Holen Sie sich das ausgewahlte Elementanderungsereignis
Dhasneem

Sie können umsetzen AdapterView.OnItemSelectedListener Klasse in Ihrer Aktivität.

Und dann verwenden Sie die folgende Zeile innerhalb onCreate()

Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);

Überschreiben Sie dann diese beiden Methoden:

public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    selection.setText(items[position]);
}

public void onNothingSelected(AdapterView<?> parent) {
    selection.setText("");
}

  • Wie bekomme ich die “Auswahl”?

    – Bruder

    27. Juli 2021 um 11:13 Uhr

1646321591 663 Android Spinner Holen Sie sich das ausgewahlte Elementanderungsereignis
Sampath

https://stackoverflow.com/q/1714426/811625

Sie können den Aufruf von OnItemSelectedListener() mit einer einfachen Prüfung vermeiden: Speichern Sie den aktuellen Auswahlindex in einer Integer-Variablen und prüfen Sie innerhalb von onItemSelected(..), bevor Sie irgendetwas tun.

Z.B:

Spinner spnLocale;

spnLocale = (Spinner)findViewById(R.id.spnLocale);

int iCurrentSelection = spnLocale.getSelectedItemPosition();

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
    if (iCurrentSelection != i){
            // Your code here
    }
    iCurrentSelection = i;
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

Natürlich die iCurrentSelection sollte im Objektbereich sein, damit dies funktioniert!

1646321594 976 Android Spinner Holen Sie sich das ausgewahlte Elementanderungsereignis
droidster.me

Suchen Sie Ihren Spinnernamen und finden Sie die ID, und implementieren Sie dann diese Methode.

spinnername.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});

Android Spinner Holen Sie sich das ausgewahlte Elementanderungsereignis
Leonid Ustenko

Es spielt keine Rolle, ob Sie OnItemSelectedListener in onCreate oder onStart festlegen – es wird immer noch während der Aktivitätserstellung bzw. dem Start aufgerufen.
Also können wir es in onCreate setzen (und NICHT in onStart!).
Fügen Sie einfach ein Flag hinzu, um die erste Initialisierung herauszufinden:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

dann in onCreate (oder onCreateView) einfach:

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (!mSpinnerInitialized) {
                    mSpinnerInitialized = true;
                    return;
                }

                // do stuff
            }

            public void onNothingSelected(AdapterView<?> adapterView) {
                return;
            }
        });

1646321595 519 Android Spinner Holen Sie sich das ausgewahlte Elementanderungsereignis
Ronin

Die Dokumentation für das Spinner-Widget sagt

Ein Spinner unterstützt keine Elementklickereignisse.

Du solltest benutzen setOnItemSelectedListener um Ihr Problem zu behandeln.

924820cookie-checkAndroid Spinner: Holen Sie sich das ausgewählte Elementänderungsereignis

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy