Domanda

dichiaro la mia Spinner nel seguente modo (è molto statico in modo che avere 2 array di stringhe in array.xml per titoli e valori)

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

Mi aspetto spinner.getSelectedItem() restituire un array di [title, value] ma in realtà restituisce solo una stringa titolo. È ignorando android:entryValues? Come faccio ad avere un valore, non un titolo da esso? È questo fattibile solo con XML o ho bisogno di creare adattatore e lo faccio di programmazione?

È stato utile?

Soluzione

Piuttosto che il metodo array doppio, perché non riempire l'ArrayAdapter di programmazione con gli oggetti di tipo noto e l'uso che. Ho scritto un tutorial di natura analoga (link in fondo) che fa questo. La premessa di base è quella di creare un array di oggetti Java, dire il filatore sulla, e quindi utilizzare gli oggetti direttamente dalla classe filatrice. Nel mio esempio ho un oggetto che rappresenta uno "Stato" che è definito come segue:

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

Poi si può compilare un filatore con una serie di queste classi come segue:

       // 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);  

È possibile recuperare l'elemento selezionato come segue:

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

E ora avete una buona fede classe Java con cui lavorare. Se si vuole intercettare quando il valore filatore modifiche, basta implementare l'OnItemSelectedListener e aggiungere i metodi appropriati per gestire gli eventi.

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 ) 
{ 
}

È possibile trovare qui tutto il tutorial: http://www.katr.com/article_android_spinner01.php

Altri suggerimenti

Quindi, se siete venuti qui perché si vuole avere sia etichetta e valore nel Spinner - ecco come ho fatto:

  1. Basta creare il tuo Spinner solito modo
  2. Definisci 2 campi di dimensioni uguali nel file array.xml. Uno per le etichette, una per i valori
  3. Imposta il tuo Spinner con android:entries="@array/labels"
  4. Nel codice - quando si ha bisogno di un valore di fare qualcosa di simile (no tu non devi catena di esso)

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

  5. E ricordate - questi 2 campi devono corrispondere tra loro per quanto riguarda gli slot numero e le posizioni

Interrompi, interrompere! Non so cosa mi ha preso, ma Spinner non supporta l'attributo android:entryValues. Che uno è in realtà da ListPreference che fa una cosa simile (elenco visualizza gli oggetti in finestra pop-up). Per quello che ho bisogno che dovrò (ahimè) utilizzare il SpinnerAdapter

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top