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?

¿Fue útil?

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:

  1. Sólo crear su Spinner la forma habitual
  2. Definir 2 matrices de igual tamaño en el archivo de array.xml. Uno de etiquetas, una para los valores
  3. Establezca 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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top