Android: configure Spinner para usar array

Declaro mi Spinner de la siguiente manera (es muy estático, así que tengo 2 matrices de cadenas en array.xml para títulos y valores)

   

Espero que spinner.getSelectedItem() devuelva una matriz [title, value] pero, de hecho, devuelve solo una cadena de título. ¿Está ignorando android:entryValues ? ¿Cómo obtengo un valor, no un título de él? ¿Es esto factible solo con XML o necesito crear un adaptador y hacerlo programáticamente?

En lugar del método de matriz dual, ¿por qué no llenar su ArrayAdapter programáticamente con objetos de un tipo conocido y usar eso? 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, contarle al spinner sobre el, y luego usar esos objetos directamente desde la clase spinner. En mi ejemplo, tengo un objeto que representa un “Estado” que se define de la siguiente manera:

 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 + ")" ); } } 

Luego puedes poblar un spinner con una matriz 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); 

Puede recuperar el elemento seleccionado de la siguiente manera:

 State st = (State)spinner.getSelectedItem(); 

Y ahora tienes una clase de Java de buena fe con la que trabajar. Si desea interceptar cuando cambia el valor del rotor, solo implemente OnItemSelectedListener y agregue 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 ) { } 

Puede encontrar el tutorial completo aquí: http://www.katr.com/article_android_spinner01.php

Entonces, si viniste aquí porque quieres tener tanto etiqueta como valor en el Spinner, así es como lo hice:

  1. Simplemente crea tu Spinner de la manera habitual
  2. Defina 2 matrices de igual tamaño en su archivo array.xml. Uno para tags, uno para valores
  3. Configura tu Spinner con android:entries="@array/labels"
  4. En su código, cuando necesite un valor, haga algo como esto (no, no tiene que encadenarlo)

     String selectedVal = getResources().getStringArray(R.array.values)[spinner .getSelectedItemPosition()]; 

  5. Y recuerda: estas 2 matrices tienen que coincidir entre sí en cuanto a ranuras de números y posiciones

¡Abortar, abortar! No sé qué me pasó, pero Spinner no admite el atributo android:entryValues . Ese es realmente de ListPreference que hace algo similar (muestra la lista de elementos en el cuadro de diálogo emergente). Para lo que necesito, tendré que (¡ay!) Usar el SpinnerAdapter