IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Spinner & initialisation de la liste [Débutant(e)]


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 533
    Par défaut Spinner & initialisation de la liste
    Bonjour,

    Je débute sous Android et je me heurte à un problème avec un Spinner.

    J'ai bien le bouquin de Mark Murphy (3ème edition), d'où j'ai récupéré un code de démo qui fonctionne bien chez lui.

    Problème: ses exemples sont simples et ne comportent toujours qu'une activité, une classe & un fichier de layout xml.

    Or mon exemple à moi comprend 3 classes
    -> la principale
    -> spinner1
    -> spinner2
    et mes deux Spinner restent désespérément vides.

    Je suppose qu'il manque "un lien" quelque part entre mes différents fichiers...

    main.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?xml version="1.0" encoding="utf-8"?>
     
    <!-- TABLE LAYOUT pour saisie ville + bouton même ligne... sachant qu un TL se transforme en LINEAR LAYOUT (vertical) entre ses balises <table row> -->
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/bois"
        android:stretchColumns="1" >
     
        <TextView
            android:id="@+id/selection"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
     
     
        <!-- ***************************** -->
        <!-- ligne saisie ville + chercher -->
        <!-- ***************************** -->
       <TableRow>
     
            <EditText
                android:id="@+id/entry"
                android:layout_span="3"
                android:hint="Entrer une ville"
                android:contentDescription="Entrer une ville"
                android:capitalize="words"
                android:inputType="textAutoCorrect"
             />
     
            <Button
                android:id="@+id/go"
                android:layout_column="2"
                android:contentDescription="lancer la recherche sur la ville"
                android:text="chercher" />
        </TableRow>
     
       <!-- *********************** -->
       <!--  ligne GEOLOCALLISATION -->
       <!-- *********************** -->
       <TableRow>
           <Button
                android:id="@+id/geoloc"
                android:layout_column="1"
                android:layout_width="fill_parent"
                android:layout_span="3"
                android:text="me géolocaliser" />
        </TableRow>
     
       <!-- ****************** -->
       <!-- ligne DEPARTEMENTS -->
       <!-- ****************** -->
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Choisir un département:"
            android:textAppearance="?android:attr/textAppearanceMedium" />
     
        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:drawSelectorOnTop="true"
            android:contentDescription="choisir un département"
            android:prompt="@string/choix_departement"
            tools:listitem="@android:layout/simple_spinner_item" 
        />
     
       <!-- ************* -->
       <!-- ligne REGIONS -->
       <!-- ************* -->
       <TextView
           android:id="@+id/textView2"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Choisir une région:"
           android:textAppearance="?android:attr/textAppearanceMedium" />
     
           <Spinner
            android:id="@+id/spinner2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:drawSelectorOnTop="true"
            android:hint="choisir une région"
            android:contentDescription="choisir une région"
            android:prompt="@string/choix_region"        
            tools:listitem="@android:layout/simple_spinner_item" 
        />
    </TableLayout>
    Test.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.bidule.mobi;
     
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Context;
    import android.view.Menu;
    import android.widget.EditText;
    import android.widget.Toast;
     
    public class test extends Activity 
    {
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.main);        
        }
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    }
    SpinnerDepartements.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package com.bidule.mobi;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Spinner;
    import android.widget.TextView;
    import android.widget.Toast;
     
    public class SpinnerDepartements extends Activity implements AdapterView.OnItemSelectedListener 
    {
        private TextView selection;
        private static final String[] items={"-choisir un département-","lorem1", "ipsum1", "dolor1",    "sit1", "amet1", "consectetuer1"};
     
        @Override
        public void onCreate(Bundle icicle) 
        {
     
            super.onCreate(icicle);
            setContentView(R.layout.main);
     
            selection=(TextView)findViewById(R.id.selection);
            Spinner spin=(Spinner)findViewById(R.id.spinner1);
            spin.setOnItemSelectedListener(this);        
            ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,items);
            aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spin.setAdapter(aa);
        }
     
     
        public void onItemSelected(AdapterView<?> parent,View v, int position, long id) 
        {
            selection.setText(items[position]);
        }
     
     
        public void onNothingSelected(AdapterView<?> parent) 
        {
            selection.setText("");
        }
    }
    SpinnerDepartements.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package com.bidule.mobi;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Spinner;
    import android.widget.TextView;
    import android.widget.Toast;
     
    public class SpinnerDepartements extends Activity implements AdapterView.OnItemSelectedListener 
    {
        private TextView selection;
        private static final String[] items={"-choisir une région-","lorem2", "ipsum2", "dolor2", "sit2", "amet2", "consectetuer2"};
     
        @Override
        public void onCreate(Bundle icicle) 
        {
            super.onCreate(icicle);
            setContentView(R.layout.main);
                selection=(TextView)findViewById(R.id.selection);
            Spinner spin=(Spinner)findViewById(R.id.spinner2);
            spin.setOnItemSelectedListener(this);
            ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,items);
            aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spin.setAdapter(aa);
        }
     
        public void onItemSelected(AdapterView<?> parent,View v, int position, long id) 
        {
            selection.setText(items[position]);
        }
     
        public void onNothingSelected(AdapterView<?> parent) 
        {
            selection.setText("");
        }
    }
    Mon, problème: les Spinner restent vides.

    Quelqu'un saurait-il m'indiquer pourquoi ?

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    La j'ai du mal à saisir l'UI....

    Tu as 3 activités (donc 3 "écrans") qui partagent le même "layout" (R.layout.main)...

    1 activité (test) ne remplit rien (et ne fait rien d'ailleurs)
    1 activité (SpinnerDepartements remplit le spinner1 (mais ne fait rien d'autre)
    1 activité (SpinnerRegions) remplit le spinner2 (mais ne fait rien d'autre)

    Quelle est l'activité initiale de l'application ? (déclarée dans le manifest comme celle à lancer par le launcher)

    Si c'est "test" => rien ne sera remplit
    Si c'est "SpinnerDepartements" => spinner1 sera remplit mais pas spinner2
    Si c'est "SpinnerRegions" => spinner2 sera remplit mais pas spinner1

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 533
    Par défaut
    Effectivement, je m'étais rendu compte que j'avais oublié le manifeste dans les codes.

    Bref, toujours est-il que c'est bien TEST qui y est déclaré.

    Donc, dois-je rajouter y SPINNERDEPARTEMENTS/REGIONS?
    Sous quelle forme?
    -> j'avais déjà essayé mais sans succès
    -> problème de syntaxe?

    Pour le reste oui, 1 layout avec 4 "objets":
    -> 1 edittext de saisie d'une ville + 1 bouton lancement recherche
    -> 2 spinners

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 533
    Par défaut Fusion : Utilise la fonction Editer
    On peut bien mettre plusieurs objets sur un même layout quand même?
    Sinon, je ne vois pas trop, en effet.

    Ou si j'ai vraiment tout faux méthodologiquement parlant, il faut juste me remettre sur les (bons) rails...

    Ce que j'aimerais faire (peut être + facile à comprendre pour vous que mon code brut ci-dessus):

    -> 1 champs de saisie d'une ville

    -> 1 bouton de lancement de la recherche de cette ville en base

    -> 1 Spinner pour le choix du département + récupération de la valeur pour recherche en base

    -> 1 spinner pour le choix de la région + récupération de la valeur pour recherche en base

    Voilà!

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Oui je crois qu'il y a un problème de "compréhension"...

    1 Activité = 1 fenêtre au sens Android... = 1 déclaration dans le manifest + 1 classe.

    Tu as une fenêtre (activity dans le manifest), un layout, donc a priori une seule classe "Activity".... On va partir du fait que c'est "test"...


    Déjà commence par renommer le nom de la classe... En Java, les classes doivent toutes être en "CamelCase" (majuscule à chaque mot, tout attaché)... Je te conseille aussi de garder le sens "activity" dans le nom de la classe... Par exemple: "TestActivity".
    N'oublies pas non plus de le renommer dans le manifest, sinon crash assuré.


    Ensuite, dans la fonction "onCreate()" c'est là que le "layout" va être démarré, et que les éléments d'interface vont être initialisés....
    Donc y mettre tout le code d'initialisation des spinner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    class TestActivity extends Activity
    {
        // traditionallement les static/final (constantes) sont en majuscules
        // dans notre cas, je te conseille quand même de passer par une ressource StringArray....
        private static final String[] REGION_ITEMS={"-choisir une région-","lorem2", "ipsum2", "dolor2", "sit2", "amet2", "consectetuer2"};
     
        private static final String[] DEPARTMENT_ITEMS = {"-choisir un département-","lorem1", "ipsum1", "dolor1",	"sit1", "amet1", "consectetuer1"};
     
        public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           // on crée les "views"
           setContentView(R.layout.main);
           // on récupère les views:
           this.selection = (TextView) findViewById(R.id.selection);
           Spinner spinner1 =(Spinner)findViewById(R.id.spinner1);
           Spinner spinner2 =(Spinner)findViewById(R.id.spinner2);
           // on les remplit
           spinner1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,DEPARTMENT_ITEMS));
           spinner2.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,REGION_ITEMS));
           // on définit les hooks
           spinner1.setOnItemSelectedListener(this);
           spinner2.setOnItemSelectedListener(this);
        }
     
     
        public void onItemSelected(AdapterView<?> parent,View v, int position, long id) 
        {
            // on récupère le texte selectionné
            String selected = (String) parent.getAdapter().getItem(position);
            // on met à jour le champ
            selection.setText(selected);
        }
        public void onNothingSelected(AdapterView<?> parent) 
        {
            selection.setText("");
        }
    }

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 533
    Par défaut
    Super, excellent, merci!

    J'ai du faire une modification, sinon ça plantait chez moi, crash de l'application, mais là un super exemple, très clair.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
        public void onCreate(Bundle savedInstanceState) 
        {
            //init
            super.onCreate(savedInstanceState);
    
            //création de l'activité
            setContentView(R.layout.main);
    
            //récup des ID des composants
            selection = (TextView) findViewById(R.id.selection);
            Spinner spinner1 =(Spinner)findViewById(R.id.spinner1);
            Spinner spinner2 =(Spinner)findViewById(R.id.spinner2);
    
            //remplissage des spinner
            //spinner1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,DEPARTEMENT_ITEMS));
            ArrayAdapter<String> aaD=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,DEPARTEMENT_ITEMS);
            spinner1.setAdapter(aaD);
            
            //spinner2.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,REGION_ITEMS));
            ArrayAdapter<String> aaR=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,REGION_ITEMS);
            spinner2.setAdapter(aaR);
            
            //définition des écouteurs spinner
            spinner1.setOnItemSelectedListener(this);
            spinner2.setOnItemSelectedListener(this);
        }
    Maintenant, en lieu & place des tableaux static, le but c'est d'initialiser les Spinner avec les data BdD d'un serveur...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. initialisation d'une liste
    Par reda24 dans le forum Général Python
    Réponses: 2
    Dernier message: 21/12/2010, 11h48
  2. Réponses: 13
    Dernier message: 06/02/2010, 16h53
  3. [AC-2003] Initialisation d'une liste déroulante à l'aide du SQL
    Par lil404 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 10/04/2009, 09h47
  4. Initialisation d'une liste avec une classe
    Par Poischack dans le forum Général Python
    Réponses: 2
    Dernier message: 26/12/2007, 23h52
  5. [STL] Initialisation d'une list
    Par franc82 dans le forum SL & STL
    Réponses: 2
    Dernier message: 23/07/2007, 08h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo