web-dev-qa-db-fra.com

Android - configurer Spinner pour utiliser le tableau

Je déclare mon Spinner de la manière suivante (il est très statique, j'ai donc 2 tableaux de chaînes dans array.xml Pour les titres et les valeurs)

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

Je m'attends à ce que spinner.getSelectedItem() retourne un tableau [title, value] Mais en fait il retourne juste une chaîne de titre. Ignore-t-il Android:entryValues? Comment puis-je obtenir une valeur, pas un titre? Est-ce faisable avec XML uniquement ou dois-je créer un adaptateur et le faire par programme?

47
Bostone

Plutôt que la méthode à double tableau, pourquoi ne pas remplir votre ArrayAdapter par programme avec des objets d'un type connu et l'utiliser. J'ai écrit un tutoriel de nature similaire (lien en bas) qui fait cela. Le principe de base est de créer un tableau d'objets Java, informer le spinner du, puis utiliser ces objets directement à partir de la classe spinner. Dans mon exemple, j'ai un objet représentant un "état" qui est défini comme suit:

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

Ensuite, vous pouvez remplir un spinner avec un tableau de ces classes comme suit:

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

Vous pouvez récupérer l'élément sélectionné comme suit:

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

Et maintenant, vous avez une véritable classe Java classe avec laquelle travailler. Si vous voulez intercepter lorsque la valeur du spinner change, implémentez simplement OnItemSelectedListener et ajoutez les méthodes appropriées pour gérer les événements.

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

Vous pouvez trouver l'intégralité du tutoriel ici: http://www.katr.com/article_Android_spinner01.php

125
KATR Software

Donc, si vous êtes venu ici parce que vous voulez avoir à la fois une étiquette et une valeur dans le Spinner - voici comment je l'ai fait:

  1. Créez simplement votre Spinner de la manière habituelle
  2. Définissez 2 tableaux de taille égale dans votre fichier array.xml. Un pour les étiquettes, un pour les valeurs
  3. Réglez votre Spinner avec Android:entries="@array/labels"
  4. Dans votre code - lorsque vous avez besoin d'une valeur, faites quelque chose comme ça (non, vous n'avez pas à la chaîner)

    String selectedVal = getResources().getStringArray(R.array.values)[spinner
                             .getSelectedItemPosition()];
    
  5. Et rappelez-vous - ces 2 tableaux doivent correspondre les uns aux autres en ce qui concerne les emplacements de numéros et les positions
55
Bostone

Abandonnez, avortez! Je ne sais pas ce qui m'est entré mais Spinner ne prend pas en charge Android:entryValues attribut. Celui-ci est en fait de ListPreference qui fait une chose similaire (affiche la liste des éléments dans la boîte de dialogue contextuelle). Pour ce dont j'ai besoin, je devrai (hélas) utiliser le SpinnerAdapter

8
Bostone