49 votes

Android - configurer le Spinner pour utiliser un tableau

Je déclare mon Spinner de la manière suivante (il est très statique donc je 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" />

J'attends spinner.getSelectedItem() pour retourner un tableau [title, value] mais en fait, il ne renvoie qu'une chaîne de titre. Ignore-t-il android:entryValues ? Comment en tirer une valeur et non un titre ? Est-ce que avec XML seulement ou dois-je créer un adaptateur et le faire de manière programmatique ? programmatiquement ?

1 votes

Même si ça ne marche pas... j'aime la simplicité de cette pensée.

136voto

KATR Software Points 656

Plutôt que d'utiliser la méthode du double tableau, pourquoi ne pas remplir votre ArrayAdapter de façon programmatique avec des objets d'un type connu et l'utiliser. J'ai écrit un tutoriel de nature similaire (lien en bas de page) qui fait cela. Le principe de base est de créer un tableau d'objets Java, d'en informer le spinner, puis d'utiliser ces objets directement depuis la classe du spinner. Dans mon exemple, j'ai un objet représentant un "State" 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 + ")" );
}
}

Vous pouvez alors 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 avec laquelle travailler. Si vous voulez intercepter les changements de valeur du spinner, il suffit d'implémenter le OnItemSelectedListener et d'ajouter 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 le tutoriel complet ici : http://www.katr.com/article_android_spinner01.php

1 votes

String toString() est la clé ici, sinon il affichera le nom de la ressource lors de la sélection du spinner.

0 votes

Alors, comment définir une valeur par défaut dans un programme ?

0 votes

Wwwwoooowwww niiice.

55voto

Bostone Points 14208

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

  1. Il suffit de créer 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. Définissez votre Spinner avec android:entries="@array/labels"

  4. Dans votre code - lorsque vous avez besoin d'une valeur, faites quelque chose comme ceci (non, vous n'avez pas besoin de l'enchaîner)

    String selectedVal = getResources().getStringArray(R.array.values)[spinner
                             .getSelectedItemPosition()];
  5. Et n'oubliez pas - ces deux tableaux doivent correspondre l'un à l'autre en ce qui concerne les emplacements et les positions des numéros.

3 votes

Les tableaux parallèles réclament plutôt Map.

0 votes

Müskitü : Je suis tout à fait d'accord avec vous, mais je pense qu'Android rend difficile l'utilisation de Maps à la place.

2 votes

Alors quel est l'intérêt de l'attribut "entryValues" lors de la définition de la listView via XML ?

8voto

Bostone Points 14208

Abandonnez, abandonnez ! Je ne sais pas ce qui m'a pris mais Spinner ne prend pas en charge android:entryValues attribut. Celui-ci vient en fait de ListPreference qui fait une chose similaire (affiche la liste des éléments dans une boîte de dialogue contextuelle). Pour ce dont j'ai besoin, je vais devoir (hélas) utiliser la fonction SpinnerAdapter

1 votes

Vous aurez envie : > Android:entries="@array/searchByValues"

0voto

Leonardo Gazio Points 1

KATR Software - TROP compliqué comme tu le fais mon ami ! J'ai passé presque 4 heures, et je n'ai toujours pas réussi à le faire fonctionner, quand j'ai abandonné ton exemple et suivi celui ci-dessous, j'ai résolu mon problème. Pourquoi ne pas simplement faire comme ça ?

http://aqueleblogdeandroid.blogspot.com.br/2011/02/utilizando-spinner-com-objetos.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X