Pregunta

¿Cómo se 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
}
¿Fue útil?

Solución

Algunas de las respuestas anteriores no son correctas. Ellos trabajan para otros widgets y puntos de vista, pero la documentación de la Widget "noreferrer" Spinner indica claramente:

  

Una ruleta no soporta elemento clic   eventos. Al llamar a este método aumentará   una excepción.

OnItemSelectedListener () 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 el método onItemSelected también se invoca cuando la vista se está en construcción, por lo que se puede considerar la posibilidad de que en el interior llamada al método onCreate().

Otros consejos

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.

evento Spinner OnItemSelectedListener ejecutará dos veces:

  1. Spinner inicialización
  2. usuario seleccionada manualmente

Trate de diferenciar esas dos variables mediante el uso de la bandera.

Puede implementar la clase AdapterView.OnItemSelectedListener en su actividad.

Y a continuación, utilizar la línea de abajo dentro onCreate()

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

Entonces anular 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 el OnItemSelectedListener () siendo llamados con una sencilla comprobación:. Almacenar el índice de selección actual en una variable entera y comprobar dentro de la onItemSelected (..) antes de hacer nada

por ejemplo:

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

De la causa del iCurrentSelection debe ser de ámbito objeto para que esto funcione!

Encuentra tu nombre y spinner Buscar ID luego implementar 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
    }
});

Los documentos para la ruleta en widgets dice

  

Una ruleta no admite eventos elemento de clic.

Debe utilizar setOnItemSelectedListener para manejar su problema.

No importa va a establecer OnItemSelectedListener en onCreate o onStart - que todavía se llama durante la creación de la actividad o iniciar (respectivamente)
. Así que podemos configurarlo en onCreate (y no en onStart!).
Sólo tiene que añadir una bandera para averiguar primera inicialización:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

entonces en onCreate (o onCreateView) justo:

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

Si desea una verdadera onChangedListener (). Almacenar el valor inicial en el controlador y comprobar para ver si ha cambiado. Es simple y hace no requerir una variable global. Funciona si usted 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 de su amigo, los utilizan.

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

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>

Esto funciona inicializar el control de giro y findViewById y utilizar esto va a trabajar

    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
        }

    });

La mejor manera lo que yo creo que sería tener una flagitemselected = 0; en onCreate(). Y el elemento seleccionado de la subasta caso de que la bandera es decir flagitemselected++; y a continuación, comprobar

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

Esto ayudará supongo.

Un truco que encontré fue poniendo sus setOnItemSelectedListeners en onWindowFocusChanged en lugar de onCreate. No he encontrado ningún malos efectos secundarios a hacerlo de esta manera, sin embargo. Básicamente, configurar los oyentes después de la ventana se ve arrastrado. No estoy seguro de qué frecuencia onWindowFocusChanged carreras, pero es bastante fácil de crear tú mismo una variable de bloqueo si usted está encontrando funcionando con demasiada frecuencia.

Creo que Android podría estar utilizando un sistema de procesamiento basado en mensajes, y si se pone todo en onCreate, usted puede funcionar en situaciones en las que el control de giro se rellena después de que se extrae. Por lo tanto, el detector estará disparar después de establecer la ubicación del elemento. Esta es una conjetura, por supuesto, pero no dude en corregirme en esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top