Android - Configurar Spinner para el uso conjunto
-
22-09-2019 - |
Pregunta
Declaro mi hilandero de la siguiente manera (es muy estática por lo que
tener 2 matrices de cadenas en array.xml
de títulos y valores)
<Spinner
android:id="@+id/searchCriteria"
android:entries="@array/searchBy"
android:entryValues="@array/searchByValues" />
espero spinner.getSelectedItem()
para devolver un conjunto [title, value]
pero en realidad se vuelve más que una cadena de título. Es ignorar
android:entryValues
? ¿Cómo consigo un valor, no un título de ella? Es
esto factible con XML única o necesito para crear adaptador y hago
mediante programación?
Solución
En lugar del método de matriz dual, por qué no llenar su ArrayAdapter programación con objetos de un tipo conocido y el uso que. He escrito un tutorial de naturaleza similar (enlace en la parte inferior) que hace esto. La premisa básica es crear una matriz de objetos Java, informe a la ruleta sobre el, y luego usar esos objetos directamente de la clase spinner. En mi ejemplo tengo un objeto que representa un "Estado", que se define como sigue:
package com.katr.spinnerdemo;
public class State {
// Okay, full acknowledgment that public members are not a good idea, however
// this is a Spinner demo not an exercise in java best practices.
public int id = 0;
public String name = "";
public String abbrev = "";
// A simple constructor for populating our member variables for this tutorial.
public State( int _id, String _name, String _abbrev )
{
id = _id;
name = _name;
abbrev = _abbrev;
}
// The toString method is extremely important to making this class work with a Spinner
// (or ListView) object because this is the method called when it is trying to represent
// this object within the control. If you do not have a toString() method, you WILL
// get an exception.
public String toString()
{
return( name + " (" + abbrev + ")" );
}
}
A continuación, puede rellenar un control de giro con una serie de estas clases de la siguiente manera:
// Step 1: Locate our spinner control and save it to the class for convenience
// You could get it every time, I'm just being lazy... :-)
spinner = (Spinner)this.findViewById(R.id.Spinner01);
// Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects
ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, new State[] {
new State( 1, "Minnesota", "MN" ),
new State( 99, "Wisconsin", "WI" ),
new State( 53, "Utah", "UT" ),
new State( 153, "Texas", "TX" )
});
// Step 3: Tell the spinner about our adapter
spinner.setAdapter(spinnerArrayAdapter);
Se puede recuperar el elemento seleccionado de la siguiente manera:
State st = (State)spinner.getSelectedItem();
Y ahora usted tiene una buena clase de buena Java para trabajar con ellos. Si desea interceptar cuando cambia el valor spinner, simplemente aplicar el OnItemSelectedListener y añadir los métodos apropiados para manejar los eventos.
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
// Get the currently selected State object from the spinner
State st = (State)spinner.getSelectedItem();
// Now do something with it.
}
public void onNothingSelected(AdapterView<?> parent )
{
}
Usted puede encontrar todo el tutorial aquí: http://www.katr.com/article_android_spinner01.php
Otros consejos
Así que si usted vino aquí porque usted quiere tener tanto etiqueta y el valor en el Spinner - aquí está cómo lo hice:
- Sólo crear su Spinner la forma habitual
- Definir 2 matrices de igual tamaño en el archivo de array.xml. Uno de etiquetas, una para los valores
- Establezca su Spinner con
android:entries="@array/labels"
-
En su código - cuando se necesita un valor de hacer algo como esto (sin usted no tiene a la cadena que)
String selectedVal = getResources().getStringArray(R.array.values)[spinner .getSelectedItemPosition()];
- Y recuerda - estos 2 conjuntos tienen que coincidir entre sí en cuanto a número y las posiciones ranuras
Anular, aborto! No sé qué me pasó, pero Spinner
no apoya atributo android:entryValues
. De eso se trata en realidad de ListPreference
el que hace una cosa similar (lista de las pantallas de los elementos de diálogo emergente). Para lo que necesito voy a tener que (por desgracia) utilizar el SpinnerAdapter