Creé una aplicación de Android con ay Spinner
a TextView
. Quiero mostrar el elemento seleccionado de la lista desplegable de Spinner en TextView. Implementé el Spinner en el onCreate
método, por lo que cuando ejecuto el programa, muestra un valor en TextView
(antes de seleccionar un elemento de la lista desplegable).
Quiero mostrar el valor en TextView solo después de seleccionar un elemento de la lista desplegable. ¿Cómo hago esto?
Aquí está mi código:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class GPACal01Activity extends Activity implements OnItemSelectedListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Spinner spinner = (Spinner) findViewById(R.id.noOfSubjects);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.noofsubjects_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
TextView textView = (TextView) findViewById(R.id.textView1);
String str = (String) parent.getItemAtPosition(pos);
textView.setText(str);
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
android
android-layout
android-spinner
Conceder
fuente
fuente
Respuestas:
Así que la primera vez maneje esto con cualquier valor entero
Ejemplo: tomar inicialmente
int check = 0;
Puede hacerlo con un valor booleano y también verificando las posiciones actuales y anteriores. Mira aquí
fuente
Simplemente ponga esta línea antes de configurar OnItemSelectedListener
fuente
setSelection(int, boolean)
llamasetSelectionInt()
internamente, y debe configurar el oyente después (en lugar de antes) de llamar a esto. Cuidado con quesetSelection(int)
no funcionará, porque llamasetNextSelectedPositionInt()
internamente, y esto es lo que me llevó aquí.A partir del nivel 3 de API, puede usar onUserInteraction () en una actividad con un valor booleano para determinar si el usuario está interactuando con el dispositivo.
http://developer.android.com/reference/android/app/Activity.html#onUserInteraction ()
Como campo en la Actividad tengo:
Finalmente, mi ruleta:
A medida que entra y pasa por la actividad, el valor booleano se restablece a falso. Funciona de maravilla.
fuente
Esto funciono para mi
La inicialización de Spinner en Android es problemática, a veces el problema anterior se resolvió mediante este patrón.
El adaptador de configuración debe ser la primera parte y onItemSelectedListener (esto) será el último al inicializar un spinner. Por el patrón de arriba, mi OnItemSelected () no se llama durante la inicialización de la ruleta
fuente
jaja ... tengo la misma pregunta. Cuando initViews () simplemente hace esto: la secuencia es la clave, el oyente es el último. Buena suerte !
fuente
Mi solución:
fuente
Para evitar llamar a spinner.setOnItemSelectedListener () durante la inicialización
fuente
Puedes hacer esto de esta manera:
Al principio creo un oyente y lo atribuyo a una devolución de llamada variable; luego creo un segundo oyente anónimo y cuando se llama por primera vez, esto cambia el oyente =]
fuente
El indicador de interacción del usuario puede establecerse en verdadero en el método onTouch y restablecerse
onItemSelected()
una vez que se haya manejado el cambio de selección. Prefiero esta solución porque el indicador de interacción del usuario se maneja exclusivamente para la ruleta, y no para otras vistas en la actividad que puedan afectar el comportamiento deseado.En codigo:
Crea tu oyente para la ruleta:
Agregue el oyente a la ruleta como an
OnItemSelectedListener
y anOnTouchListener
:fuente
Una solución simple similar que permite múltiples hiladores es colocar el AdapterView en una colección, en la superclase de Actividades, en la primera ejecución de onItemSelected (...) Luego verifique si el AdaptadorView está en la colección antes de ejecutarlo. Esto habilita un conjunto de métodos en la superclase y admite múltiples AdapterViews y, por lo tanto, múltiples hiladores.
Superclase ...
Subclase ...
}
fuente
crear un campo booleano
dentro de crear la actividad
fuente
Prueba esto
fuente
Puede lograrlo mediante setOnTouchListener primero y luego setOnItemSelectedListener en onTouch
fuente
Esto funcionó para mí:
fuente
Basado en la respuesta de Abhi, hice este simple oyente
fuente
Tuve el mismo problema y esto funciona para mí:
Tengo 2 hilanderos y los actualizo durante init y durante las interacciones con otros controles o después de obtener datos del servidor.
Aquí está mi plantilla:
Cuando la clase se inicia, use setSpinnersListeners () en lugar de configurar directamente el oyente.
El Runnable evitará que la ruleta se dispare en ItemSelected justo después de que establezca sus valores.
Si necesita actualizar la ruleta (después de una llamada al servidor, etc.) use removeSpinnersListeners () justo antes de sus líneas de actualización, y setSpinnersListeners () justo después de las líneas de actualización. Esto evitará que onItemSelected se active después de la actualización.
fuente
Código
fuente
Para mí, la solución de Abhi funciona muy bien hasta el nivel 27 de Api.
Pero parece que desde el nivel 28 de Api en adelante, onItemSelected () no se llama cuando se configura el oyente, lo que significa que onItemSelected () nunca se llama.
Por lo tanto, agregué una breve declaración if para verificar el nivel de API:
Creo que es bastante extraño y no estoy seguro si otros también tienen este problema, pero en mi caso funcionó bien.
fuente
Coloqué un TextView encima del Spinner, del mismo tamaño y fondo que el Spinner, para tener más control sobre cómo se veía antes de que el usuario haga clic en él. Con TextView allí, también podría usar TextView para marcar cuando el usuario ha comenzado a interactuar.
Mi código de Kotlin se parece a esto:
El archivo de diseño se ve más o menos así, con la parte importante de que Spinner y TextView comparten el mismo ancho, alto y márgenes:
Estoy seguro de que las otras soluciones funcionan donde ignora la primera llamada onItemSelected, pero realmente no me gusta la idea de suponer que siempre se llamará.
fuente