2009-10-19 13 views
42

dichiaro la mia Spinner nel seguente modo (è molto statica così ho ho 2 array di stringhe in array.xml per titoli e valori)Android - configurare Spinner per usare array di

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

mi aspetto spinner.getSelectedItem() per restituire una matrice [title, value] ma in realtà restituisce solo un titolo String. Ignora lo android:entryValues? Come ottengo un valore, non un titolo? questo è possibile solo con XML o devo creare l'adattatore e farlo a livello di programmazione ?

+1

anche se non funziona ... mi piace la semplicità di quel pensiero – kritzikratzi

risposta

110

Piuttosto che il metodo dual-array, perché non riempire programmaticamente il tuo ArrayAdapter con oggetti di tipo noto e usarlo. Ho scritto un tutorial di natura simile (link in basso) che fa questo. La premessa di base è quella di creare una serie di oggetti Java, raccontare lo spinner e quindi utilizzare tali oggetti direttamente dalla classe spinner. 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 + ")"); 
} 
} 

Quindi è possibile 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'articolo selezionato come segue:

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

E ora si ha una classe Java autentica con cui lavorare. Se si desidera intercettare quando il valore del filatore cambia, implementare semplicemente 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) 
{ 
} 

Potete trovare l'intero tutorial qui: http://www.katr.com/article_android_spinner01.php

+0

String toString() è la chiave qui, altrimenti verrà visualizzato il nome della risorsa quando si seleziona lo spinner – adadion

+0

quindi, come impostare un valore predefinito nel programma? –

7

Annullare, interrompere! Non so cosa mi abbia preso ma il Spinner non supporta l'attributo android:entryValues. Quello è in realtà da ListPreference che fa una cosa simile (visualizza l'elenco degli elementi nella finestra di dialogo a comparsa). Per quello che ho bisogno che dovrò (ahimè) utilizzare il SpinnerAdapter

+1

Vi verrà voglia:> Android: voci = "@ array/searchByValues ​​" – Blundell

54

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 come al solito
  2. Definisci 2 array di uguale dimensione 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 non si dispone a catena è)

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

  5. e ricordate - questi 2 matrici devono corrispondere tra loro per quanto slot numero e le posizioni
+3

Gli array paralleli gridano invece per Map. – m0skit0

+0

müskitü: Sono completamente d'accordo con te, ma penso che Android renda difficile l'utilizzo di Maps. –

+2

allora qual è il punto dell'attributo "entryValues" quando si definisce listView via XML? – sports

Problemi correlati