451 Stimmen

Android Spinner: Abrufen des Änderungsereignisses für das ausgewählte Element

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
}

0 Stimmen

Ich habe diese Antworten ausprobiert, aber keine war hilfreich. Sobald Spinner Komponente unterstützt nicht Element klicken Ereignisse. Spinner Dokumentation

899voto

znq Punkte 43755

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

Ein Spinner unterstützt keinen Elementklick Ereignisse. Der Aufruf dieser Methode löst eine eine Ausnahme.

Bessere Nutzung 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 bei mir.

Beachten Sie, dass die onItemSelected-Methode auch aufgerufen wird, wenn die Ansicht erstellt wird, also können Sie in Erwägung ziehen, sie in onCreate() Methodenaufruf.

53 Stimmen

Das Problem dabei ist, dass die onItemSelected-Methode auch aufgerufen wird, wenn die Ansicht erstellt wird. Der dort geschriebene Code wird also auch beim Start ausgeführt. Gibt es eine Möglichkeit, den enthaltenen Code nur dann auszuführen, wenn der Benutzer tatsächlich ein Element ausgewählt hat?

40 Stimmen

Eigentlich dieses Problem gelöst werden kann, indem Sie die SetOnItemSelectedListener in der überschreiben OnStart-Methode und nicht in der onCreate-Methode. dumm mich...

17 Stimmen

Ich habe den Listener in der onStart-Methode, aber es wird aufgerufen, bevor der Benutzer überhaupt etwas zu sehen bekommt, genau wie onCreate ist, so, in meinem Fall, wo eine Schaltfläche "Weiter", die unsichtbar sein soll, bis der Benutzer etwas auswählt, die Schaltfläche bei der ersten Anzeige sichtbar gemacht wird. Sie sagen, dass Ihre Erfahrung anders ist? Wenn ja, was machen Sie in der onStart-Methode anders, das ich übersehe?

63voto

Santhosh Punkte 1267
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;
    } 
}); 

Nota: Denken Sie an eine Sache.

Spinner OnItemSelectedListener Ereignis wird zweimal ausgeführt:

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

Versuchen Sie, diese beiden mit Hilfe der Flaggenvariablen zu unterscheiden.

3 Stimmen

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

22 Stimmen

Setzen Sie einfach einen globalen Boolean wie Boolean initialDisplay = true; Und dann in Ihrem onSelect sehen, ob es wahr ist, und wenn es ist, nicht tun, was auch immer Sie waren zu tun, auf wählen, aber setzen Sie das Flag auf false, für das nächste Mal, wenn es aufgerufen wird (wenn der Benutzer tatsächlich wählt).

0 Stimmen

Beste Erklärung zur Ausführung von OnclickListener.

25voto

Dhasneem Punkte 3469

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

Und dann verwenden Sie die folgende Zeile in onCreate()

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

Dann überschreiben Sie 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("");
}

0 Stimmen

Wie erhalte ich die "Auswahl"?

21voto

Sampath Punkte 1019

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 überprüfen Sie ihn innerhalb der onItemSelected(..), bevor Sie etwas 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 ist die iCurrentSelection sollte im Objektbereich sein, damit dies funktioniert!

1 Stimmen

Sie können keine nicht-finale Variable innerhalb einer anonymen inneren Klasse verwenden. Wenn die iCurrentSelection Variable innerhalb dieser anonymen Klasse deklariert ist, funktioniert sie einwandfrei. Sie könnten sie mit -1 initialisieren, damit der Code beim ersten Aufruf ausgeführt wird.

2 Stimmen

@dahvyd hatte recht, wenn Sie dies verwenden, muss der int final sein. Auf jeden Fall funktioniert es sehr gut. Ich habe ein EditText-Feld deaktiviert, wenn die Position 0 nicht ausgewählt war, und wenn sich dies änderte, wurde es wieder aktiviert. Vielen Dank dafür.

12voto

Leonid Ustenko Punkte 13310

Es spielt keine Rolle, ob Sie OnItemSelectedListener in onCreate oder onStart setzen - es wird immer noch während der Erstellung oder dem Start der Aktivität (bzw.) aufgerufen.
Wir können sie also in onCreate (und NICHT in onStart!) festlegen.
Fügen Sie einfach ein Flag hinzu, um die erste Initialisierung zu ermitteln:

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;
            }
        });

1 Stimmen

Danke, dass Sie diese Flagge verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X