wake-up-neo.com

Android - Konfigurieren Sie Spinner für die Verwendung eines Arrays

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?

47
Bostone

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

125
KATR Software

Wenn du also hierher gekommen bist, weil du sowohl Label als auch Wert im Spinner haben willst - so habe ich es gemacht:

  1. Erstellen Sie einfach Ihren Spinner wie gewohnt
  2. Definieren Sie 2 Arrays gleicher Größe in Ihrer array.xml-Datei. Eine für Beschriftungen, eine für Werte
  3. Setze deinen Spinner mit Android:entries="@array/labels"
  4. 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()];
    
  5. Und denken Sie daran - diese 2 Arrays müssen in Bezug auf die Anzahl der Slots und Positionen übereinstimmen
55
Bostone

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

8
Bostone