Quiero usar un Spinner que inicialmente (cuando el usuario aún no ha hecho una selección) muestra el texto "Seleccionar uno". Cuando el usuario hace clic en la ruleta, se muestra la lista de elementos y el usuario selecciona una de las opciones. Después de que el usuario haya hecho una selección, el elemento seleccionado se muestra en el control giratorio en lugar de "Seleccionar uno".
Tengo el siguiente código para crear un Spinner:
String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
Con este código, inicialmente se muestra el elemento "Uno". Simplemente podría agregar un nuevo elemento "Seleccionar uno" a los elementos, pero luego "Seleccionar uno" también se mostraría en la lista desplegable como primer elemento, que no es lo que quiero.
¿Como puedo solucionar este problema?
android
android-spinner
Pieter Kuijpers
fuente
fuente
Respuestas:
Aquí hay una solución general que anula la
Spinner
vista. Se anulasetAdapter()
para establecer la posición inicial en -1, y representa el suministradoSpinnerAdapter
para mostrar la cadena de solicitud para la posición inferior a 0.Esto se ha probado en Android 1.5 a 4.2, ¡pero cuidado con el comprador! Debido a que esta solución se basa en la reflexión para llamar al privado
AdapterView.setNextSelectedPositionInt()
yAdapterView.setSelectedPositionInt()
, no se garantiza que funcione en futuras actualizaciones del sistema operativo. Parece probable que lo hará, pero de ninguna manera está garantizado.Normalmente no toleraría algo como esto, pero esta pregunta se ha hecho suficientes veces y parece una solicitud lo suficientemente razonable como para pensar que publicaría mi solución.
fuente
Lo que puede hacer es decorarlo
SpinnerAdapter
con uno que presente una vista 'Seleccionar opción ...' inicialmente para que el Spinner se muestre sin nada seleccionado.Aquí hay un ejemplo de trabajo probado para Android 2.3 y 4.0 (no usa nada en la biblioteca de compatibilidad, por lo que debería estar bien por un tiempo) Como es un decorador, debería ser fácil adaptar el código existente y también funciona bien con
CursorLoader
s. (Intercambiar el cursor en la envoltura,cursorAdapter
por supuesto ...)Hay un error de Android que hace que sea un poco más difícil reutilizar las vistas. (Por lo tanto, debe usar
setTag
u otra cosa para asegurarse de queconvertView
sea correcto). Spinner no admite múltiples tipos de vistaNotas de código: 2 constructores
Esto le permite utilizar una solicitud estándar o definir su propio 'nada seleccionado' como la primera fila, o ambas, o ninguna. (Nota: algunos temas muestran un DropDown para un Spinner en lugar de un cuadro de diálogo. El menú desplegable normalmente no muestra el mensaje)
Define un diseño para 'verse' como un indicador, por ejemplo, atenuado ...
Usando un aviso estándar (observe que no hay nada seleccionado):
O con un aviso y algo dinámico (podría no haber tenido ningún aviso también):
Uso en el ejemplo anterior
contact_spinner_row_nothing_selected.xml
NothingSelectedSpinnerAdapter.java
fuente
Terminé usando un
Button
en su lugar. Si bien aButton
no es aSpinner
, el comportamiento es fácil de personalizar.Primero cree el adaptador como de costumbre:
Tenga en cuenta que estoy usando el
simple_spinner_dropdown_item
como la identificación de diseño. Esto ayudará a crear una mejor apariencia al crear el diálogo de alerta.En el controlador onClick para mi botón tengo:
¡Y eso es!
fuente
Primero, puede estar interesado en el
prompt
atributo de laSpinner
clase. Vea la imagen a continuación, "Elija un planeta" es el mensaje que se puede configurar en el XML conandroid:prompt=""
.Iba a sugerir una subclase
Spinner
, donde podría mantener dos adaptadores internamente. Un adaptador que tiene la opción "Seleccionar uno", y el otro adaptador real (con las opciones reales), luego useOnClickListener
para cambiar los adaptadores antes de que se muestre el cuadro de diálogo de opciones. Sin embargo, después de intentar implementar esa idea, llegué a la conclusión de que no puede recibirOnClick
eventos para el widget en sí.Puede envolver la rueda giratoria en una vista diferente, interceptar los clics en la vista y luego indicarle
CustomSpinner
que cambie el adaptador, pero parece un truco horrible.¿Realmente necesitas mostrar "Seleccionar uno"?
fuente
Este código ha sido probado y funciona en Android 4.4
fuente
getItem(getCount())
está subrayado rojo para mí? No se puede resolver el método setHintEncontré esta solución:
Simplemente cambie la matriz [0] con "Select One" y luego en onItemSelected, cámbiele el nombre a "One".
No es una solución con clase, pero funciona: D
fuente
No hay una API predeterminada para establecer una sugerencia en Spinner. Para agregarlo, necesitamos una pequeña solución alternativa que no sea una implementación de reflexión de seguridad
Fuente del adaptador:
Fuente original
fuente
android.R.id.text1
getCount
Muchas respuestas aquí, pero me sorprende que nadie sugiriera una solución simple: coloque un TextView en la parte superior del Spinner. Establezca un detector de clics en TextView que oculta TextView muestra el Spinner y llama a spinner.performClick ().
fuente
Tuve el mismo problema para spinner, con una selección vacía, y encontré una mejor solución. Echa un vistazo a este código simple.
Aquí spinneradapter es una pequeña personalización para arrayadapter. Se parece a esto:
fuente
Puede cambiarlo a una vista de texto y usar esto:
y luego definir la
android:text
propiedad.fuente
Archivo XML:
Actividad:
onCreate:
Algunas funciones (agregar cosas al adaptador mediante programación)>
Ahora tiene una ruleta vacía y puede escribir código para no abrir el cuadro de diálogo si está vacío. O pueden presionar hacia atrás. Pero también lo completa con una función u otra lista durante el tiempo de ejecución.
fuente
He intentado lo siguiente. Tome un botón y dele el evento de clic. Al cambiar el fondo del botón, parece ser una ruleta.
Declarar como variables globales alertdialog y valor por defecto.
fuente
Esta es mi manera:
fuente
Eche un vistazo a la aplicación iosched para obtener una solución de propósito general para agregar un elemento al principio de una lista. En particular, si está utilizando un CursorAdapter, mire TracksAdapter.java que amplía esa definición para proporcionar un método "setHasAllItem" y el código asociado para administrar el recuento de la lista para tratar con el elemento adicional en la parte superior.
Con el adaptador personalizado, puede establecer el texto en "Seleccionar uno" o cualquier otra cosa que desee que diga ese elemento principal.
fuente
Tengo un spinner en mi main.xml y su id es
@+id/spinner1
Esto es lo que escribo en mi función OnCreate:
No necesita ninguna implementación en la clase.
fuente
Encontré muchas buenas soluciones para esto. La mayoría funciona agregando un elemento al final del adaptador y no muestra el último elemento en la lista desplegable. El gran problema para mí fue que la lista desplegable de la flecha comenzará desde el final de la lista. Entonces, el usuario ve los últimos elementos en lugar de los primeros elementos (en caso de tener muchos elementos para mostrar), después de tocar la rueda giratoria por primera vez.
Así que puse el elemento de pista al comienzo de la lista. y ocultar el primer elemento en la lista desplegable.
establezca el diseño a continuación en @Override getDropDownView () cuando la posición es 0, para ocultar la primera fila de pistas.
R.layout.spinner_hint_list_item_layout:
fuente
Además, hay un simple truco para mostrar el valor predeterminado:
Puede agregar un valor predeterminado en su lista y luego agregar toda su colección usando
list.addAll(yourCollection);
Ejemplo de código viable aquí:
Espero que recupere tu complejidad. ¡Feliz codificación!
fuente
Creo que la forma más fácil es crear un elemento ficticio en el índice 0 que dice "seleccionar uno" y luego, al guardar, tal vez verifique que la selección no sea 0.
fuente
Este es mi último ejemplo "todo incluido" para un botón giratorio
En activity_my_form.xml
En strings.xml
En MyFormActivity.java
¡Finalmente obtuve un tamaño de fuente configurable sin ningún ítem seleccionable! Gracias a HRJ
fuente
Al extender
SpinnerAdapter
, anula dosView
métodos de producción,getView(int, View, ViewGroup)
ygetDropDownView(int, View, ViewGroup)
. El primero suministra elView
insertado en elSpinner
mismo; el segundo proporciona elView
en la lista desplegable (como su nombre indica). Puede anular el comandogetView(...)
para que, hasta que se seleccione un elemento, muestreTextView
un mensaje que contenga; luego, cuando detecta que un elemento ha sido seleccionado, lo cambia para mostrar unTextView
correspondiente a ese.fuente
Spinner
tutorial (que supuestamente muestra unToast
mensaje DESPUÉS de haber seleccionado un elemento), DEBE funcionar: developer.android.com/resources/tutorials/views/…Para aquellos que usan Xamarin, aquí está el C # equivalente a la respuesta de aaronvargas anterior.
fuente
También resolví este problema usando el siguiente código. Supongamos que tiene una lista de elementos, p. Ej.
Ahora tenemos que proporcionar las cadenas a spinner porque spinner no puede entender el objeto. Así que crearemos una nueva lista de matriz con elementos de cadena como este ->
Ahora tenemos una
itemStringArrayList
lista de matriz con dos elementos de cadena. Y tenemos que mostrar el texto "Seleccionar elemento" como primer elemento. Entonces tenemos que insertar una nueva cadena en elitemStringArrayList
.Ahora tenemos una lista de matriz
itemsArrayList
y queremos mostrar dos elementos en el menú desplegable. Pero la condición aquí es ... Si no seleccionamos nada,Select Item
debería aparecer como primer elemento que no se habilitará.Entonces podemos implementar esta funcionalidad como esta. Si necesita cargar los elementos de la lista de la matriz en el spinner de Android. Entonces tendrá que usar algún adaptador. Así que aquí usaré el
ArrayAdapter
. También podemos usar el adaptador personalizado.Aquí en este código. estamos utilizando el diseño personalizado de spinner, es decir
R.layout.spinner_item
. Es una simple vista de textoNecesitamos deshabilitar el primer texto en la ruleta. Entonces, para la posición 0, estamos deshabilitando el texto. Y también podemos establecer el color anulando el método getDropDownView. De esta manera obtendremos el spinner esperado.
fuente
Solo usaría un RadioGroup con RadioButtons si solo tiene tres opciones, puede hacer que todas estén desmarcadas al principio.
fuente
Ninguna de las respuestas enviadas anteriormente realmente funcionó de la manera que quería resolver este problema. Para mí, la solución ideal proporcionaría el "Seleccione uno" (o cualquier texto inicial) cuando se muestra por primera vez la ruleta. Cuando el usuario toca la rueda giratoria, el texto inicial no debe ser parte del menú desplegable que se muestra.
Para complicar aún más mi situación particular, los datos de mi spinner provienen de un cursor que se carga a través de las devoluciones de llamada de LoaderManager.
Después de una considerable experimentación, se me ocurrió la siguiente solución:
fuente
Manejo esto usando un botón en lugar de un Spinner. Tengo el proyecto de muestra en GitHub.
En el proyecto, estoy mostrando el Spinner y el botón para mostrar que realmente se ven idénticos. Excepto el botón, puede establecer el texto inicial a lo que desee.
Así es como se ve la actividad:
NOTA: Sí, me doy cuenta de que esto depende del tema aplicado y el aspecto será ligeramente diferente si usa Theme.Holo. Sin embargo, si está utilizando uno de los temas heredados, como Theme.Black, está listo para comenzar.
fuente
si enfrenta este problema cuando sus elementos se rellenan desde el cursor de base de datos ,
La solución más simple que encontré en esta respuesta SO:
use UNION en su consulta de adaptador de cursor y agregue el elemento adicional con id = -1 al resultado de la consulta, sin agregarlo realmente a la base de datos:
algo como:
si el elemento seleccionado es -1, entonces es el valor predeterminado. De lo contrario, es un registro de la tabla.
fuente
Parece una solución banal, pero generalmente pongo simplemente un TextView en el frente de la ruleta. Todo el Xml se ve así. (Hola chicos, no me disparen, sé que a algunos de ustedes no les gusta este tipo de matrimonio):
Luego oculto TextView cuando se selecciona un elemento. Obviamente, el color de fondo de TextView debe ser el mismo que el Spinner. Funciona en Android 4.0. No sé en versiones anteriores.
Si. Debido a que Spinner llama a setOnItemSelectedListener al principio, ocultar la vista de texto puede ser un poco complicado, pero se puede hacer de esta manera:
fuente
para mí funcionó algo así. tiene la mejora que solo cambia el texto en ALGUNAS opciones, no en todas.
Primero tomo los nombres de la ruleta y creo el adaptador de matriz con una vista personalizada, pero no importa ahora, la clave es anular getView y cambiar los valores que necesita cambiar. En mi caso fue solo el primero, el resto lo dejo original
fuente
aquí hay uno simple
fuente
Consulte una de las respuestas anteriores: https://stackoverflow.com/a/23005376/1312796
Agregué mi código para corregir un pequeño error. Eso donde no se recuperaron datos ... ¡Cómo mostrar el texto de solicitud ...!
Aquí está mi truco ... Funciona bien conmigo. !
Intente colocar su ruleta en un Relative_layouta y alinee una vista de texto con su ruleta y juegue con la visibilidad de la vista de texto (MOSTRAR / OCULTAR) siempre que el adaptador de la ruleta se cargue o se vacíe.
Aquí está el código:
llame a este método después y antes de que el adaptador giratorio esté cargado y vacío.
fuente