Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Transformer un "spinner" en "bit"

    16 août 2017 à 22:57:19

    Bonjour à tous! 

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

    Le code xml : 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="20dp">
    
    
        <Space
            android:layout_width="match_parent"
            android:layout_height="20dp"></Space>
    
    
        <Spinner
            android:id="@+id/spinner"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:entries="@array/liste_genre"/>
    
    
        <Space
            android:layout_width="match_parent"
            android:layout_height="20dp"></Space>
    
    
    
    </LinearLayout>
    

    et le code xml "values"

     <resources>
    <string name="app_name">Exemple_listView</string>

    <string-array name="liste_genre">
    <item>homme</item>
    <item>femme</item>
    </string-array>
    </resources>

    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!

    Cyril

    -
    Edité par CyrilBaltz 16 août 2017 à 23:01:09

    • Partager sur Facebook
    • Partager sur Twitter
      17 août 2017 à 8:51:05

      Salut,

      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&lt;?&gt; 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.

      • Partager sur Facebook
      • Partager sur Twitter
        17 août 2017 à 13:11:51

        Hello! 

        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. 

        Merci d'avance pour vos réponses! 

        -
        Edité par CyrilBaltz 17 août 2017 à 20:11:22

        • Partager sur Facebook
        • Partager sur Twitter
          17 août 2017 à 23:30:26

          Salut,

          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;
              }
          }
          

          Puis pour l'adapter :

          spinner.setAdapter(new ArrayAdapter<myenum>(this, android.R.layout.simple_spinner_item, MyEnum.values()));

          Finalement pour récupérer la valeur de a :

          @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>

          -
          Edité par rolandl 21 août 2017 à 21:49:45

          • Partager sur Facebook
          • Partager sur Twitter
            21 août 2017 à 20:23:45

            Hello! 

            Merci pour ton aide! 

            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!

            Cyril  

            • Partager sur Facebook
            • Partager sur Twitter
              21 août 2017 à 21:46:39

              Pour comprendre le code lié à l'énumération, je t'invite à lire ce chapitre du cours d'OpenClassrooms : https://openclassrooms.com/courses/apprenez-a-programmer-en-java/les-enumerations-1

              Concernant les ";" c'est surtout le formatage du code qui a sauté lors du post. Je vais éditer mon précédent message pour corriger ça.

              • Partager sur Facebook
              • Partager sur Twitter
                21 août 2017 à 22:33:33

                Ok je commence à comprendre. Je vais checker ton lien merci beaucoup! 

                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? 

                • Partager sur Facebook
                • Partager sur Twitter
                  22 août 2017 à 8:38:35

                  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?

                  Si te te pose ce genre de question n'est que tu n'as pas acquis les bases de la programmation orientée objet et de manière générale la notion de portabilité d'une variable. Je t'invite à lire la partie dédiée dans le cours du site : https://openclassrooms.com/courses/apprenez-a-programmer-en-java/votre-premiere-classe

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 août 2017 à 11:11:15

                    Ok j'ai lu le cours. Va falloir que je le lise plusieurs fois pour me l'approprier mais dans l'ensemble ça me semble ok. 

                    Par contre, j'y suis toujours pas :(

                    De ce que j'ai compris, j'envoie bien mon "label" (homme/femme) mais j'envoie pas ma valeur a vu que je ne fais pas de :

                        public int toInt(){
                            return a;
                        }

                    non? Enfin je n'arrive pas à utiliser :

                    parent.getItemAtPosition(position).a;

                    quoi qu'il arrive... peut être que je suis un cas désespéré :(

                    -
                    Edité par CyrilBaltz 22 août 2017 à 11:11:35

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 août 2017 à 15:37:15

                      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.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 août 2017 à 16:26:45

                        Du coup j'ai fais un :

                            public int getA(){
                                return a;
                            }

                        Mais la commande : 

                        parent.getItemAtPosition(position).a;

                        ne fonctionne toujours pas... 

                        J'ai l'impression de ne pas être très claire. Si par exemple je clique sur "homme" dans mon spinner, j'aimerais faire un truc du genre : 

                        var=parent.getItemAtPosition(position).a;
                        

                        mais mon "a" indique "cannot resolve symbol 'a'. (var est une variable déclaré en public au début de mon code pour simplifié les choses). 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 août 2017 à 16:29:37

                          Si tu fais un getter, tu dois faire parent.getItemAtPosition(position).getA();

                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 août 2017 à 16:46:45

                            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;
                                }
                            
                            
                            }

                            mon fichier xml (au cas où) :

                            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:orientation="vertical"
                                android:padding="20dp">
                            
                            
                            
                                <TextView
                                    android:layout_width="match_parent"
                                    android:layout_height="wrap_content"
                                    android:layout_gravity="center"
                                    android:gravity="center"
                                    android:text="Je suis?"
                                    android:textSize="25sp"
                                    android:textStyle="bold" />
                            
                            
                                <Spinner
                                    android:id="@+id/spinner1"
                                    android:layout_width="match_parent"
                                    android:layout_height="wrap_content"
                                    android:text="sélectionner genre"/>
                            </LinearLayout>
                            


                            -
                            Edité par CyrilBaltz 22 août 2017 à 16:47:07

                            • Partager sur Facebook
                            • Partager sur Twitter
                              22 août 2017 à 17:00:28

                              Tu peux caster le résultat :

                              ((MyEnum)parent.getItemAtPosition(position)).getA()
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 août 2017 à 8:21:03

                                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.

                                merci d'avance!

                                -
                                Edité par CyrilBaltz 23 août 2017 à 8:23:29

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  23 août 2017 à 8:57:32

                                  Salut,

                                  Concernant le bluetooth, tu as pas mal de choses dans la documentation officielle : https://developer.android.com/guide/topics/connectivity/bluetooth.html

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 août 2017 à 20:00:15

                                    J'ai déjà un peu regardé, c'est pas tout simple. J'ouvrirais certainement une nouvelle conversation pour le bluetooth ^^

                                    encore merci! 

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    [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.
                                    • Editeur
                                    • Markdown