Frage

Wie kann man den Ereignis-Listener für einen Spinner gesetzt, wenn das ausgewählte Element ändert?

Im Grunde, was ich versuche zu tun, etwas Ähnliches wie folgt aus:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
War es hilfreich?

Lösung

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

  

Ein Spinner nicht unterstützt Artikel klicken   Veranstaltungen. Das Aufrufen dieser Methode wird angehoben   eine Ausnahme.

Bessere verwenden OnItemSelectedListener () statt:

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 onItemSelected Methode auch aufgerufen, wenn die Ansicht Build wird, so können Sie prüfen es in onCreate() Methodenaufruf setzen.

Andere Tipps

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: Denken Sie daran, eine Sache.

Spinner OnItemSelectedListener Ereignis wird ausgeführt, zweimal:

  1. Spinner Initialisierung
  2. Benutzer ausgewählt manuell

Versuchen Sie diese beiden unter Verwendung Flagvariable zu unterscheiden.

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

Und dann die Verwendung unterhalb der Linie innerhalb onCreate()

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

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

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

Sie können die OnItemSelectedListener vermeiden () mit einem einfachen Test aufgerufen werden. Speicher, um den aktuellen Auswahlindex in einer Integer-Variablen und Prüfung innerhalb des onItemSelected (..) vor etwas zu 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;
    } 
}); 

Von der Ursache des iCurrentSelection im Objekt Rahmen für diese Arbeit sein soll!

Finden Sie Ihren Spinner Namen und finden id dann diese Methode implementieren.

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

Die Dokumentation für den Spinner-Widget sagt

  

Ein Spinner nicht Artikel Click-Ereignisse unterstützen.

Sie sollten setOnItemSelectedListener verwenden, Ihr Problem zu behandeln.

Es spielt keine Rolle, werden Sie setzen OnItemSelectedListener in onCreate oder onStart - es wird noch während der Aktivitätserstellung oder starten (bzw.) aufgerufen werden
. Also haben wir es in onCreate (und NICHT in onStart!) Einstellen.
Fügen Sie einfach ein Flag, um herauszufinden, Erstinitialisierung:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

dann in onCreate (oder onCreateView) nur:

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;
            }
        });
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

Wenn Sie ein wahrer onChangedListener (). Lagern Sie den Anfangswert in dem Handler und prüfen, ob sie sich geändert hat. Es ist einfach und macht nicht eine globale Variable erfordern. Arbeiten, wenn Sie mehr als ein 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, sie verwenden.

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

nimmt eine globale Variable für aktuelle Auswahl der Spinner:

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>

Dies funktioniert intialize den Spinner und findViewById und verwenden diese wird es funktionieren

    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
        }

    });

Der beste Weg, was ich denke, wäre eine flagitemselected = 0; in onCreate() zu haben. Und zum Produkt ausgewählte Ereignis Schritt das Flag d.h flagitemselected++; und dann überprüfen

if(flagitemselected!=1)
{
// do your work here
}

Dies wird helfen, denke ich.

Ein Trick, den ich gefunden wurde, setzen Sie Ihre setOnItemSelectedListeners in statt onCreate onWindowFocusChanged. Ich habe keine schlechten Nebenwirkungen zu tun es auf diese Weise, noch nicht gefunden. Grundsätzlich eingerichtet, um die Zuhörer, nachdem das Fenster gezogen wird. Ich bin nicht sicher, wie oft läuft onWindowFocusChanged, aber es ist einfach genug, um sich eine Sperrvariable zu erstellen, wenn Sie es finden, zu oft ausgeführt wird.

ich glaube, Android könnte ein nachrichtenbasierte Verarbeitungssystem verwenden, und wenn man sie alle in onCreate setzen, können Sie in Situationen führen, wo der Spinner bevölkert nachdem sie gezogen wird. So wird Ihre Zuhörer abfeuern, nachdem Sie die Position des Elements festgelegt. Das ist eine Vermutung, natürlich, aber ich fühle mich frei, mich auf das korrigieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top