Spinner Android: Obtener el evento de cambio de elemento seleccionado
-
20-09-2019 - |
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
}
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:
- Spinner inicialización
- 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.