2009-10-19 15 views
42

Declaro mi hilandero de la siguiente manera (es muy estática así que tengo 2 matrices de cadenas en array.xml de títulos y valores)Android - configurar Spinner utilizar matriz

<Spinner android:id="@+id/searchCriteria" android:entries="@array/ 
searchBy" android:entryValues="@array/searchByValues"> 
</Spinner> 

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

+1

incluso si no funciona ... me gusta la simplicidad de ese pensamiento – kritzikratzi

Respuesta

110

en lugar del método de doble matriz, ¿por qué no llene su ArrayAdapter programáticamente con objetos de un tipo conocido y úselo. 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 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); 

Puede recuperar el elemento seleccionado de la siguiente manera:

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

Y ahora usted tiene una buena clase de Java para 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 todo el tutorial aquí: http://www.katr.com/article_android_spinner01.php

+0

String toString() es la clave aquí; de lo contrario, mostrará el nombre del recurso al seleccionar el control numérico – adadion

+0

, entonces, ¿cómo establecer un valor predeterminado en el programa? –

7

Abortar, abortar! No sé qué me pasó, pero Spinner no admite el atributo android:entryValues. Ese es en realidad de ListPreference que hace algo similar (muestra la lista de elementos en el cuadro de diálogo emergente). Para lo que necesito voy a tener que (por desgracia) utilizar el SpinnerAdapter

+1

Va a querer:> android: entradas = "@ array/searchByValues ​​" – Blundell

54

Así que si usted vino aquí porque usted quiere tener tanto etiqueta y el valor en el Spinner - aquí es cómo lo hice:

  1. Basta con crear su Spinner de la manera habitual
  2. Defina 2 matrices de igual tamaño en su archivo array.xml. Uno de etiquetas, una para los valores
  3. Fije su Spinner con android:entries="@array/labels"
  4. 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()]; 
    

  5. y recuerda - estos 2 conjuntos tienen que coincidir entre sí en cuanto a número y las posiciones ranuras
+3

Las matrices paralelas gritan por Map en su lugar. – m0skit0

+0

müskitü: Estoy totalmente de acuerdo contigo, pero creo que Android hace que sea difícil usar Maps en su lugar. –

+2

, ¿cuál es el sentido del atributo "entryValues" al definir listView a través de XML? – sports

Cuestiones relacionadas