it-swarm.com.de

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

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

Im Grunde versuche ich etwas zu tun:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
345
Soni Ali

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

Ein Spinner unterstützt kein Elementklick Veranstaltungen. Ein Aufruf dieser Methode führt zu einer Erhöhung von eine Ausnahme.

Verwenden Sie besser 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 beim Erstellen der Ansicht aufgerufen wird. Sie können sie also in den Aufruf der onCreate()-Methode aufnehmen. 

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

Hinweis: Erinnere dich an eine Sache. 

Das OnItemSelectedListener-Ereignis von Spinner wird zweimal ausgeführt:

  1. Spinnerinitialisierung 
  2. Benutzer manuell ausgewählt

Versuchen Sie, diese beiden zu unterscheiden, indem Sie die Flagvariable verwenden.

49
Santhosh

Sie können die AdapterView.OnItemSelectedListener-Klasse in Ihre Activity implementieren.

Und dann die folgende Zeile innerhalb von onCreate() verwenden

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("");
}
15
Dhasneem

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

Sie können den Aufruf von OnItemSelectedListener () durch eine einfache Überprüfung verhindern: Speichern Sie den aktuellen Auswahlindex in einer Integer-Variablen und überprüfen Sie ihn innerhalb von 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;
    } 
}); 

Die iCurrentSelection sollte im Objektbereich sein, damit dies funktioniert!

14
Sampath

Die Dokumentation für das Spinner-Widget lautet: "Ein Spinner unterstützt keine Elementklickereignisse." Sie sollten "setOnItemSelectedListener" verwenden, um Ihr Problem zu lösen

6
johndotnet

Suchen Sie nach Ihrem Spinnernamen und der ID, und implementieren Sie 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
    }
});
5
droidster.me
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);
5
Chiwai Chan

Es spielt keine Rolle, ob Sie OnItemSelectedListener in onCreate oder onStart setzen - es wird immer noch während der Aktivitätserstellung bzw. des Startens 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;
            }
        });
3
Leo Droidcoder

Wenn Sie einen echten onChangedListener () wünschen. Speichern Sie den Anfangswert im Handler und prüfen Sie, ob er geändert wurde. Es ist einfach und erfordert nicht eine globale Variable. Funktioniert, wenn Sie mehr als einen Spinner auf der Seite haben.

String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

        private SpinnerSelectedListener() {
            super();
        }

        public SpinnerSelectedListener(String initialValue) {
            this();
            this.initialValue = initialValue;
        }

        private String initialValue;

        // getter and setter removed.  

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final String newValue = (String) spinHeight.getItemAtPosition(position);
            if (newValue.equals(initialValue) == false) {
               // Add your code here.  The spinner has changed value. 

               // Maybe useful.   
               // initialValue = newValue;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
               // Maybe useful.   
               // initialValue = null; 
        }
    }

Objekte sind dein Freund, benutze sie. 

3
fishjd

nimm eine globale Variable für die aktuelle Auswahl des Spinners:

int currentItem = 0;

spinner_counter = (Spinner)findViewById(R.id.spinner_counter);
String[] value={"20","40","60","80","100","All"};
aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value);
aa.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinner_counter.setAdapter(aa);

spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(currentItem == position){
                return; //do nothing
            }
            else
            {
                 TextView spinner_item_text = (TextView) view;
                 //write your code here
            }
            currentItem = position;
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

//R.layout.spinner_item_profile
<?xml version="1.0" encoding="utf-8"?>

<TextView  Android:id="@+id/spinner_item_text"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent" 
Android:layout_height="wrap_content"
Android:background="@drawable/border_close_profile"
Android:gravity="start"  
Android:textColor="@color/black"         
Android:paddingLeft="5dip"
Android:paddingStart="5dip"
Android:paddingTop="12dip"
Android:paddingBottom="12dip"
/>

//drawable/border_close_profile
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item>
   <shape Android:shape="rectangle">
    <solid Android:color="#e2e3d7" />
   </shape>
 </item>
<item Android:left="1dp"
Android:right="1dp"
Android:top="1dp"
Android:bottom="1dp">
<shape Android:shape="rectangle">
    <solid Android:color="@color/white_text" />
</shape>
</item>
</layer-list>
2
indrajeet
spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {

                    // TODO Auto-generated method stub
                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }
                //add some code here
            }
        );
2
kaub0st3r

Der beste Weg, was ich denke, wäre ein Flagitemselected = 0; in oncreate. Und bei einem ausgewählten Element das Flag inkrementieren, d. H. Flagitemselected ++; und prüfen Sie dann, ob (flagitemselected! = 1) {// Ihre Arbeit hier tun}

0
Pinakin

Ein Trick, den ich gefunden habe, bestand darin, Ihre setOnItemSelectedListeners in onWindowFocusChanged anstelle von onCreate zu platzieren. Ich habe noch keine schlimmen Nebenwirkungen festgestellt, wenn ich es so mache. 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 auf Nachrichten basierendes Verarbeitungssystem. Wenn Sie alles in onCreate einfügen, können Situationen auftreten, in denen der Spinner gefüllt wird, nachdem er gezeichnet wurde. Ihr Listener wird also ausgelöst, nachdem Sie den Elementspeicherort festgelegt haben. Dies ist natürlich eine begründete Vermutung, aber Sie können mich diesbezüglich gerne korrigieren.

0
Joe Plante

Dies funktioniert Initialisiert den Spinner und findviewbyid und verwendet diese Funktion 

    Spinner schemeStatusSpinner;

  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);

schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }

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

    });
0
sanjay

Brilliant von Stefan Klumpp hat mir auch sehr geholfen. Vielen Dank. Ich bin ein Neuling und die "@Override" -Datei hat einen Fehler verursacht, der besagt, dass "eine Superklassenmethode mit demselben Namen überschrieben werden muss". Eclipse schlug vor, die Overrides zu entfernen. Als ich das tat, hat es funktioniert. Bitte frag mich nicht wie und warum.

0
user241569