Android – configurez Spinner pour utiliser le tableau

Je déclare mon Spinner de la manière suivante (c’est très statique donc j’ai 2 tableaux de array.xml dans array.xml pour les titres et les valeurs)

   

Je m’attends à ce que spinner.getSelectedItem() renvoie un tableau [title, value] mais en fait, il ne retourne qu’une chaîne de titre. Est-ce ignorer android:entryValues ? Comment puis-je obtenir une valeur, pas un titre? Est-ce possible avec XML uniquement ou dois-je créer un adaptateur et le faire par programme?

Plutôt que la méthode dual array, pourquoi ne pas remplir votre ArrayAdapter par programme avec des objects d’un type connu et l’utiliser. J’ai écrit un tutoriel de même nature (lien en bas) qui fait cela. La prémisse de base consiste à créer un tableau d’objects Java, à en parler au spinner, puis à utiliser ces objects directement à partir de la classe spinner. Dans mon exemple, j’ai un object représentant un “État” 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 Ssortingng name = ""; public Ssortingng abbrev = ""; // A simple constructor for populating our member variables for this tutorial. public State( int _id, Ssortingng _name, Ssortingng _abbrev ) { id = _id; name = _name; abbrev = _abbrev; } // The toSsortingng 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 toSsortingng() method, you WILL // get an exception. public Ssortingng toSsortingng() { return( name + " (" + abbrev + ")" ); } } 

Ensuite, vous pouvez remplir un compteur 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 bonne classe Java avec laquelle travailler. Si vous souhaitez intercepter lorsque la valeur de 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 le tutoriel complet ici: http://www.katr.com/article_android_spinner01.php

Donc, si vous êtes venu ici parce que vous voulez avoir à la fois l’étiquette et la valeur dans 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:ensortinges="@array/labels"
  4. Dans votre code – lorsque vous avez besoin d’une valeur, faites quelque chose comme ça (non, vous n’avez pas besoin de l’enchaîner)

     Ssortingng selectedVal = getResources().getSsortingngArray(R.array.values)[spinner .getSelectedItemPosition()]; 

  5. Et rappelez-vous – ces 2 tableaux doivent correspondre les uns aux autres en ce qui concerne les positions de nombre et les positions

Abandonner, avorter! Je ne sais pas ce qui m’a pris mais Spinner ne supporte pas android:entryValues atsortingbut android:entryValues . Celui-ci est en fait de ListPreference qui fait une chose similaire (affiche la liste des éléments dans la boîte de dialog contextuelle). Pour ce dont j’ai besoin je SpinnerAdapter (hélas) utiliser le SpinnerAdapter