Frage

Ich erkläre meinen Spinner in der folgenden Weise (es ist sehr statisch so I haben zwei 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() einen Array [title, value] zurückzukehren aber in der Tat es gibt nur einen Titel String. Ist es zu ignorieren android:entryValues? Wie bekomme ich einen Wert, keinen Titel von ihm? ist dies machbar mit XML nur oder muss ich Adapter erstellen müssen und es tun programmatisch?

War es hilfreich?

Lösung

Anstatt die Dual-Array-Methode, warum nicht Ihre ArrayAdapter füllen programmatisch mit Objekten einer bekannten Art und Verwendung der. Ich habe ein Tutorial von ähnlicher Natur (Link unten) geschrieben, das dies tut. Die Grundvoraussetzung ist eine Reihe von Java-Objekten zu erstellen, erzählt die Spinner über die, und dann diese Objekte direkt aus der Spinner-Klasse verwenden. In meinem Beispiel habe ich ein Objekt darstellt, einen „Staat“, 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 mit einer Reihe dieser Klassen wie folgt benutzt:

       // 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 abzurufen, wie folgt:

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

Und jetzt haben Sie eine bona fide Java-Klasse zu arbeiten. Wenn Sie abfangen wollen, wenn der Spinner Wert ändert, sondern nur die OnItemSelectedListener implementieren und die entsprechenden Methoden hinzufügen, um die Ereignisse zu verarbeiten.

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

Sie können das ganze Tutorial finden Sie hier: http://www.katr.com/article_android_spinner01.php

Andere Tipps

Also, wenn Sie hierher gekommen, weil Sie beiden Label und Wert in den Spinnern haben wollen - hier sind, wie ich es getan hätte:

  1. Erstellen Sie einfach Ihre Spinner die übliche Art und Weise
  2. definieren 2 gleich große Arrays in Ihrer array.xml Datei. Ein für Etiketten, ein für Werte
  3. Stellen Sie Ihren Spinner mit android:entries="@array/labels"
  4. In Ihrem Code - wenn Sie benötigen einen Wert etwas tun (kein Sie nicht an der Kette haben es)

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

  5. Und denken Sie daran - diese zwei Arrays einander so weit wie Anzahl Slots und Positionen entsprechen haben

Abbruch, Abbruch! Ich weiß nicht, was in mich gefahren ist, aber Spinner nicht unterstützt android:entryValues Attribut. Dass man tatsächlich von ListPreference, die tut eine ähnliche Sache (zeigt Liste der Elemente im Pop-up-Dialog). Für das, was ich brauche, werde ich (leider) haben verwenden Sie die SpinnerAdapter

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top