Après quelques recherches, j'ai réussi à réaliser une mini appli qui permet d'afficher l'item sélectionner dans un menu déroulant (spinner). Je vous mets tout ça :
le code java :
package com.pandaenterprise.cyril.exemple_listview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//création de l'objet Spinner
Spinner spinner;
//pour ajouter des datas dans un spinner, on a besoin d'un "adapteur"
ArrayAdapter<CharSequence> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initialisation de l'objet Spinner
spinner = (Spinner) findViewById(R.id.spinner);
//initialise l'oblet adapter
adapter = ArrayAdapter.createFromResource(this, R.array.liste_genre, android.R.layout.simple_spinner_item);
//on initialise le layout du menu déroulant
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//ajout de l'adapter dans le spinner
spinner.setAdapter(adapter);
//création de l'évènement qui va gérer ça
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getBaseContext(),parent.getItemAtPosition(position)+ " : selected", Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
Du coup quand je sélectionne Homme, j'ai un petit message "Homme selected" et quand je sélectionne Femme, j'ai un petit message "femme selected". yey!
Maintenant je voudrais pouvoir affecter une valeur à ma sélection. Par exemple "Homme" vaut 0 et "Femme" vaut 1. Le problème c'est que je n'ai pas capté comment "chopper" ces items. J'aimerais bien écrire un code du genre :
public long a = 0; //initalisation de la variable
if (getItem == homme){
a = 0;
}
else {
a=1;
}
Sauf que le getItem comme ça bah... ça n'existe pas Donc si vous avez un lien ou un bout de code qui explique ça, ça m'aiderais beaucoup! Merci d'avance!
Si tu veux faire des choses au plus simple (et au plus moche et sale), il convient simplement de comparer ce que tu récupères dans la méthode onItemSelected avec les valeurs attendus :
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getBaseContext(),parent.getItemAtPosition(position)+ " : selected", Toast.LENGTH_LONG).show();
if("homme".equals(parent.getItemAtPosition(position)) == true) {
a = 0;
}
else {
a=1;
}
}
Le problème avec cette méthode c'est que tu va devoir la mettre à jour à chaque fois que tu voudras ajouter un élément dans ton Spinner.
Le mieux reste encore de jouer avec une énumération (ou un StringDef à voir) afin d'associer la valeur numérique souhaitée pour chaque élément qui compose le spinner. Grâce à la méthode parent.getItemAtPosition(position) tu récupéreras alors une énumération et du pourras récupérer directement l'entier de manière assez générique.
Merci pour la ligne rolandl. C'est bien ce que je cherchais.
Par contre je suis assez d'accord avec toi sur le fait que je vais avoir quelque chose d'assez lourd dès que je vais avoir plus de 2 spinners. Je ne connaissais pas la méthode d'énumération. C'est pour ça que j'ai tenté l'approche plus haut. Par contre, ça m'a l'air vraiment intéressant mais je dois avouer ne pas trop savoir comment m'y prendre. Aurais-tu un lien qui explique ça bien?
Sachant que j'ai un spinner, je déclare des "items" dans un fichier "values" (string.xml). Ce que j'ai trouvé pour le moment donne effectivement des valeurs à des variables mais dans la class main à priori. Je ne sais pas du coup si c'est possible de donner des valeurs à des items d'un autre fichier?
Je ne sais pas si mes questions semblent un peu bête mais je débute dans les applications et je suis aussi plus ou moins débutant en Java donc hum... merci beaucoup pour votre temps!
Edit : j'ai eu une autre idée vis à vis de cela, je ne sais pas si c'est la bonne :
Est-ce que mes items ont des "valeurs"?
En gros est-ce qu'ils ont déjà une valeur lorsque je l'ai défini? Ca pourrait peut être m'aider dans ce cas.
L'objectif est effectivement de donner la valeur à ton énumération lorsque tu la construits. Il est possible, à l'image des classes, d'ajouter des constructeurs et des attributs à une énumération.
L'idée est de définir quelque chose du genre pour l'énumération :
public enum MyEnum{
Boy("homme", 1),
Girl("femme", 0);
private final String label;
private final int a;
private MyEnum(String label, int a){
this.a = a;
this.label = label;
}
@Override public String toString(){
return label;
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
parent.getItemAtPosition(position).a;
}
Ici j'ai mis des chaînes de caractères en dur, mais rien de t'empêche de donner des références vers des resources XML de type string si tu souhaites internationaliser ton application.</myenum></myenum></myenum></myenum></myenum>
J'ai un peu du mal à comprendre ton code par contre
Pour la première partie, faut il que je créé une nouvelle classe où je mets le code dans mon main?
Toujours dans ce code, à quoi correspond "Boy" et "Girl" ? Est-ce que "homme" et "femme" dedans correspond à mes items dans mon fichier string? Bref je suis perdu dans ce code ^^
Concernant l'adapter, es-tu sûr de cette ligne de code? généralement les ";" indiquent une nouvelle ligne de code? je ne comprend pas non plus cette ligne ^^
Elle indique qu'il faut que j'enlève tout ça dans mon code ?
//initialisation de l'objet Spinner
spinner = (Spinner) findViewById(R.id.spinner);
//initialise l'oblet adapter
adapter = ArrayAdapter.createFromResource(this, R.array.liste_genre, android.R.layout.simple_spinner_item);
//on initialise le layout du menu déroulant
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//ajout de l'adapter dans le spinner
spinner.setAdapter(adapter);
Aussi, je n'arrive du coup pas à mettre en place le getItemAtPosition. J'imagine que cela provient d'une erreur sur les ";" du coup?
Bref, c'est la galère niveau compréhension. Si tu as le temps de développer un peu tout ça pour que je m'en sorte ce serait super! Merci encore pour ton temps!
CyrilBaltz a écrit:
> Dernière question pour ce soir. Le fait que "a" soit déclaré en private ne pose pas problème par la suite pour récupérer la valeur?
Effectivement, la variable a étant privée dans mon exemple, on ne pouvait pas y accéder de la manière dont je le montre. Libre à toi de la rendre public ou de de faire un getter pour y accéder.
Bon je dois avoir raté quelque chose... Quoi que je fasse j'ai le message "cannot resolve symbol"...
DU coup je te mets le programme que j'ai tel qu'il est. Si tu as le temps de jeter un coup d'oeil pour trouver mon erreur (certainement de débutant). (Je sais que je me répète mais merci encore pour le temps que tu m'accordes).
HomeActivity : (mon MainActivity c'est juste un splash screen donc je ne pense pas que ce soit la peine de s'embêter avec ça)
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class HomeActivity extends AppCompatActivity {
public static final String TAG = "HomeActivity";
public int var=0;
//création de l'objet Spinner
Spinner spinner1;
//pour ajouter des datas dans un spinner, on a besoin d'un "adapteur"
ArrayAdapter<CharSequence> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
//initialisation des objets Spinner
spinner1 = (Spinner) findViewById(R.id.spinner1);
//on set les valeurs des énumérations dans le spinner grâce à ArrayAdapter
spinner1.setAdapter(new ArrayAdapter<MyEnum1>(this, android.R.layout.simple_spinner_item, MyEnum1.values()));
//création de l'évènement qui va gérer le spinner1
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//var=parent.getItemAtPosition(position).getA();
Toast.makeText(getBaseContext(),parent.getItemAtPosition(position)+" : selected", Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}); } }
Quand je désactive le commentaire de la ligne var=parent.getItemAtPosition(position).getA(); le getA() se met en rouge.
Mon enum :
public enum MyEnum1 {
Boy("homme", 1),
Girl("femme", 0);
private final String label;
public final int a;
private MyEnum1(String label, int a){
this.a = a;
this.label = label;
}
@Override
public String toString(){
return label;
}
public int getA(){
return a;
}
}
Ok c'est bon je l'ai! ça marche! du moins je peux afficher la valeur "var" grâce à cette ligne de code et je vais maintenant pouvoir travailler avec. Merci beaucoup!
avant de clôturer le sujet. As-tu un bon tuto (je n'ai rien trouvé sur openclassroom) qui explique comment "envoyer/recevoir" des infos en Bluetooth?
J'aimerais pouvoir envoyer ma "var" mais ce que je trouve généralement sur internet, ce sont des tutos pour activer, rechercher et s'appareiller en Bluetooth. Hors, je veux faire ça manuellement (réglage de l'appareil) pour ensuite juste avoir à envoyer les infos.
J'ai déjà un peu regardé, c'est pas tout simple. J'ouvrirais certainement une nouvelle conversation pour le bluetooth
encore merci!
[Android] Transformer un "spinner" en "bit"
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog