Android Spinner: Obtener el evento de cambio de elemento seleccionado

¿Cómo puede configurar el detector de eventos para un Spinner cuando cambia el elemento seleccionado?

Básicamente lo que estoy tratando de hacer es algo similar a esto:

spinner1.onSelectionChange = handleSelectionChange; void handleSelectionChange(Object sender){ //handle event } 

14 Solutions collect form web for “Android Spinner: Obtener el evento de cambio de elemento seleccionado”

Algunas de las respuestas anteriores no son correctas. Trabajan para otros widgets y vistas, pero la documentación del widget Spinner indica claramente:

Una ruleta no admite eventos de clic de artículo. Al llamar a este método se generará una excepción.

Mejor usar OnItemSelectedListener () en su lugar:

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

Esto funciona para mí.

Tenga en cuenta que onItemSelected método también se invoca cuando la vista se está construyendo, por lo que puede considerar ponerlo dentro de la llamada a método onCreate() .

 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: Recuerde una cosa.

OnItemSelectedListener evento Spinner OnItemSelectedListener se ejecutará dos veces:

  1. Inicialización de Spinner
  2. Usuario seleccionado manualmente

Trate de diferenciar esos dos usando la variable flag.

Puede implementar la clase AdapterView.OnItemSelectedListener en su actividad.

Y luego utilice la línea debajo de onCreate()

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

A continuación, anule estos dos métodos:

 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

Puede evitar que OnItemSelectedListener () sea llamado con una comprobación simple: Almacene el índice de selección actual en una variable entera y compruébelo dentro de la onItemSelected (..) antes de hacer nada.

P.ej:

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

Por causa de la iCurrentSelection debe estar en el ámbito de objeto para que esto funcione!

Los documentos para el widget de spinner dice: "Un spinner no admite eventos de clic de artículo." Debe utilizar "setOnItemSelectedListener" para manejar su problema

 spinner1.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { //add some code here } ); 

Encuentre su nombre de hilandero e identifique la búsqueda e implemente este método.

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

Tomar una variable global para la selección actual de 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> 
 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 } ); 

No importa que se establezca OnItemSelectedListener en onCreate o onStart – se seguirá llamando durante la creación de actividad o start (respectivamente).
Así que podemos configurarlo en onCreate (y NO en onStart!).
Sólo tiene que añadir una bandera para averiguar la primera inicialización:

 private Spinner mSpinner; private boolean mSpinnerInitialized; 

Entonces en onCreate (o onCreateView) sólo:

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

Brillante lo anterior por Stefan Klumpp también me ayudó mucho. Gracias. Soy un novato y el "@Override" s en que causó un error sobre "debe sustituir un método de clase Super con el mismo nombre". Eclipse sugirió que debería eliminar las sustituciones. Cuando hice esto, funcionó. Por favor, no me pregunte cómo o por qué.

La mejor manera que creo que sería tener un flagitemselected = 0; En crecer Y en el elemento seleccionó el incremento de evento que flag ie flagitemselected ++; Y luego comprueba si (flagitemselected! = 1) {// haz tu trabajo aquí}. Esto me ayudará a suponer

Si desea un verdadero onChangedListener (). Guarde el valor inicial en el controlador y compruebe si ha cambiado. Es simple y no requiere una variable global. Funciona si tiene más de una ruleta en la página.

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

Los objetos son tu amigo, úsalos.

Un truco que encontré fue poner su setOnItemSelectedListeners en onWindowFocusChanged en lugar de onCreate. No he encontrado efectos secundarios negativos para hacerlo de esta manera, todavía. Básicamente, configurar los oyentes después de la ventana se dibuja. No estoy seguro de cuántas veces se ejecutaWindowFocusChanged, pero es bastante fácil crear una variable de bloqueo si lo encuentras ejecutándose con demasiada frecuencia.

Creo que Android podría estar usando un sistema de procesamiento basado en mensajes, y si lo pone todo en onCreate, puede encontrarse con situaciones en las que el spinner se llena después de que se dibuja. Por lo tanto, su oyente se disparará después de establecer la ubicación del artículo. Esta es una suposición educada, por supuesto, pero siéntase libre de corregirme en esto.

  • Actionbarsherlock IcsSpinner - el ancho siempre se ajusta a los elementos más amplios
  • Guardar el valor del elemento seleccionado mediante la preferencia compartida
  • ¿Cómo crear un spinner con título en él?
  • Android: se centra en EditText después de la selección de Spinner
  • Android Spinner - ¿Cómo hacer que la vista desplegable sea transparente?
  • Tema predeterminado de Spinner a EditarTexto android
  • No se puede administrar a requestFocus a Spinner
  • Spinner con texto largo no funciona bien
  • Spinner.setSelection no activa OnItemSelectedListener correctamente
  • Spinner elemento prensado fondo azul
  • ¿Cómo podemos crear hilanderos similares a iPhone en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.