En este post explicaré cómo establecer un arreglo de cadenas como una lista desplegable o select en Android, usando el widget Spinner y llamando al método setAdapter.
Lo que haremos será ver cómo llenar el Spinner con opciones de un arreglo y además saber cuál opción fue seleccionada.
En nuestro diseño vamos a poner un elemento de tipo Spinner. Es importante ponerle un id para obtener una referencia a él más tarde. En mi caso queda así:
<Spinner
android:id="@+id/spinnerCategoriaLugar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
Puede que en tu caso le agregues más cosas, sobre todo por eso de la orientación y ubicación dentro del layout. Fíjate que el id que tiene es spinnerCategoriaLugar
.
Luego definimos una variable de instancia (hasta arriba después del nombre de la clase) en Java así:
private Spinner spinerCategoriaLugar;
Y más abajo la iniciamos. Si estás en una actividad, pon lo siguiente dentro del método onCreate
:
spinerCategoriaLugar = findViewById(R.id.spinnerCategoriaLugar);
Si es en un fragmento entonces recomiendo ponerlo dentro del método onViewCreated
, así:
spinerCategoriaLugar = view.findViewById(R.id.spinnerCategoriaLugar);
En donde la variable view
se nos pasa en onViewCreated
como primer parámetro.
Ahora que ya tenemos la referencia al Spinner vamos a definir un arreglo de las opciones que tendrá. Cuando las tengamos, llamamos a setAdapter y listo. El código queda así:
// Este ejemplo es por si estás en un fragmento
// Lista de elementos que se pondrán en el spinner
String[] categorias = {"Maquilero", "Deshebrado"};
spinerCategoriaLugar.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_dropdown_item, categorias));
El ejemplo funciona con fragmentos, en un momento veremos cómo hacerlo dentro de una actividad. Por ahora analicemos los argumentos.
El método setAdapter
recibe un simple adaptador que en este caso es de tipo ArrayAdapter
. Pero al crear ArrayAdapter
necesitamos 3 argumentos:
getActivity()
, si estás en una actividad le pasas el nombre de la actividad.this
como se ve en este post. Y ya en el peor de los casos llamas a getApplicationContext()
aunque no lo recomiendo.android.R.layout.simple_spinner_dropdown_item
Si no lo entendiste arriba, para llenarlo dentro de una actividad pasa el nombre de la actividad con .this
en el primer argumento.
Suponiendo que estás en una actividad llamada MainActivity quedaría así:
String[] categorias = {"Maquilero", "Deshebrado"};
spinerCategoriaLugar.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, categorias));
Más información en mi otro post sobre el contexto.
Cuando quieras obtener lo que el usuario seleccionó de la lista desplegable llama a getSelectedItem
y castea a String
. Así:
String categoria = (String) spinerCategoriaLugar.getSelectedItem();
El ejemplo de arriba obtiene la opción seleccionada pero no escucha los cambios del spinner.
Si quieres saber cuando se selecciona otro elemento agrega un listener de tipo OnItemSelectedListener
llamando a setOnItemSelectedListener
y sobrescribe métodos así:
spinerCategoriaLugar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
String categoria = (String) spinerCategoriaLugar.getSelectedItem();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
// No seleccionaron nada
}
});
De esta manera sabrás cada que se seleccione otra opción. Con eso terminamos este post; te invito a ver más sobre Android en mi blog.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios