Ich deklariere meinen Spinner folgendermaßen (es ist sehr statisch, daher habe ich 2 String-Arrays in array.xml
Für Titel und Werte)
<Spinner
Android:id="@+id/searchCriteria"
Android:entries="@array/searchBy"
Android:entryValues="@array/searchByValues" />
Ich erwarte, dass spinner.getSelectedItem()
ein Array [title, value]
Zurückgibt, aber tatsächlich gibt es nur einen Titel-String zurück. Ignoriert es Android:entryValues
? Wie erhalte ich einen Wert, keinen Titel? Ist dies nur mit XML möglich oder muss ich einen Adapter erstellen und programmgesteuert ausführen?
Befüllen Sie Ihren ArrayAdapter nicht mit der Dual-Array-Methode, sondern programmgesteuert mit Objekten eines bekannten Typs, und verwenden Sie diese Methode. Ich habe ein Tutorial ähnlicher Art geschrieben (Link unten), das dies tut. Die Grundvoraussetzung besteht darin, ein Array von Java - Objekten zu erstellen, den Spinner über das zu informieren und diese Objekte dann direkt aus der Spinner-Klasse zu verwenden. In meinem Beispiel habe ich ein Objekt, das einen "Zustand" darstellt, der wie folgt definiert ist:
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 + ")" );
}
}
Dann können Sie einen Spinner wie folgt mit einem Array dieser Klassen bestücken:
// 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);
Sie können das ausgewählte Element wie folgt abrufen:
State st = (State)spinner.getSelectedItem();
Und jetzt haben Sie eine echte Java Klasse, mit der Sie arbeiten können. Wenn Sie abfangen möchten, wenn sich der Spinner-Wert ändert, implementieren Sie einfach den OnItemSelectedListener und fügen Sie die entsprechenden Methoden zur Behandlung der Ereignisse hinzu.
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 )
{
}
Das gesamte Tutorial finden Sie hier: http://www.katr.com/article_Android_spinner01.php
Wenn du also hierher gekommen bist, weil du sowohl Label als auch Wert im Spinner haben willst - so habe ich es gemacht:
Android:entries="@array/labels"
In Ihrem Code - wenn Sie einen Wert benötigen, machen Sie so etwas (nein, Sie müssen ihn nicht verketten)
String selectedVal = getResources().getStringArray(R.array.values)[spinner
.getSelectedItemPosition()];
Abbrechen, abbrechen! Ich weiß nicht, was in mich gefahren ist, aber Spinner
unterstützt das Attribut Android:entryValues
Nicht. Dieser ist eigentlich von ListPreference
, der eine ähnliche Funktion ausführt (zeigt die Liste der Elemente im Popup-Dialogfeld an). Für das, was ich brauche, muss ich (leider) das SpinnerAdapter
verwenden