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

  1. #41
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    hello,

    oui je sais pour les MP, mais celui-ci était vital, comme tu l'as vu si tu l'as lu.
    -> et puis des choses que je ne voulais pas exposer en public...

    et comme tu l'as vu, ce n'est pas parce que je demande de l'aide que je reste à attendre que ça tombe "tout cuit", je persévère aussi de mon coté.

    pour le reste, je vais étudier ça de près.

    comme je vais devoir décliner ça à plusieurs endroit:
    -> y a-t-il moyen simple de faire une fonction commune pour la partie "connexion http" & accessible par tous les ASYNC? est ce que ça a vraiment un intérêt d'ailleurs?

    -> ou juste faire un copy/paste pour chaque nouvelle classe async, la modifier où il faut, et ça roule comme ça finalement?

    merci.

  2. #42
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    j'ai corrigé 1 erreur (manque de paramètres), me semble-t-il, concernant adapter dans le onPostExecute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    KO   ArrayAdapter<String> adapter = new ArrayAdapter<String>(values);
    
    OK   ArrayAdapter<String> adapter = new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_spinner_item, values);
    par contre, maintenant que ça passe à la compil, j'ai un java.lang.NullPointerException d'exécution au remplissage du spinner avec les data:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.spinner.setAdapter(adapter);

  3. #43
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    J'ai pas posté un code final qui compile hein ! j'ai pas le temps de m'amuser à ça....

    Donc oui il est null parcequ'il est pas initialisé, il faut donc l'initialiser quelque part !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Et c'est bien le cas, comme je le montrais hier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_spinner_item, values);
    
    if (adapter == null) {Log.d("********* TestActivity adapter ","adapter NULL");}
    
    this.spinner.setAdapter(adapter);
    Pire, il ne débranche même pas dans le log, c'est bien ça le "truc"...

  5. #45
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Eclipse t'envois pas un joli warning avec ce code la dessus ?

    Moi (avec mes settings) j'ai même une erreur (code mort)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_spinner_item, values);
    if (adapter == null) {Log.d("********* TestActivity adapter ","adapter NULL");}
    Le Log.d est effet 'mort' (adapter ne peut jamais être null !)

    Ok... il faut initialiser le spinner ... comment tu l'initialise ?
    Un truc genre:
    RemplirSpinners task = new RemplirSpinners();
    task.spinner = ...;
    task.execute();

    Ou un constructeur avec le spinner en parametre au constructeur de la classe


    Au fait pour répondre à la question du "refaire le code pour chaque appel HTTP", je répond par: c'est exactement ce que les premiers objets que j'avais posté font... Une classe qui s'occupe de récupérer le JSON de manière asynchrone...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, autant pour moi confusion de variable dans le code:
    -> spinner: sans init
    -> spinner1: init ok

  7. #47
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Voilà, j'ai remplacé tous mes accès réseau/PHP "old school" par des classes Async!

    Le dernier point de blocage concerne un AutoCompleteTextView sur un champ ville.

    AVANT:
    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
     
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    {
    String result = null;
    InputStream is = null;
    List<String> r = new ArrayList<String>();
     
        	if (ville.enoughToFilter())		//REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)!
        	{
    	    	//établissement de la connexion http
    	    	is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText());
     
    	    	//récup des data brutes ~> string
    	    	result = lectureData(is);
     
    	        //décodage JSON de l'input stream
    	        try
    	        {        	
    	            //remplissage DATA
    	        	JSONArray jArray = new JSONArray(result);
    	          	JSONObject json_data=null;
    	           	for(int i=0;i<jArray.length();i++)
    	           	{
    	                   json_data = jArray.getJSONObject(i);  
    	                   r.add(json_data.getString("VILLE"));
    	                   a_idVil.add(json_data.getString("CLEF_VILLE"));      
    	            }
    	           	ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,r));
    	           	ville.setOnItemSelectedListener(new villeListener());
     
    	        }
    	        catch(JSONException e1)
    	        {
    	            	Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
    	            	Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--");
    	        } 
    	        catch(ParseException e1) 
    	        {
    	            	Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
    	            	Log.d("***** TestActivity/onTextChanged: ParseException *****", "--"+e1.toString()+"--");
    	      	}
          	}
    }
     
    public class villeListener implements OnItemSelectedListener 
    {
            public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) 
            {
            	villePosition = pos; 	
            }
            public void onNothingSelected(AdapterView<?> arg0)	{	}
    }
    fonctionnement 100% normal:
    -> à partir du 4ème caractère saisi, une rqt est lancée en base pour trouver toutes les villes débutant par ces 4 caractères + affichage en liste, avec sélection de la bonne ville
    -> le listener affecte bien l'indice de la ville choisie dans la liste


    APRES:
    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
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    {    		
    	if (ville.enoughToFilter())		//REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)!
    	{    		
    		new RemplirVille().execute(BASE_URL + "ville.php?ville=" + ville.getText());
    		Log.d("***********","AVANT");  
    		ville.setOnItemSelectedListener(new villeListener());
    		Log.d("***********","APRES");    		
    	}
    
    }
    public class villeListener implements OnItemSelectedListener 
    {
    	public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) 
    	{
    		villePosition = pos;
    		Log.d("*************9999999", "1111111111");
    	}
    	public void onNothingSelected(AdapterView<?> arg0)	{	}
    }
    
    class RemplirVille extends AsyncTask<String, String, List<String>>
    {
    	Integer errorMsgId;
    	String  errorMsgParam;
    	
    	protected List<String> doInBackground(String... param)
    	{
    		List<String> listeAffichageVille = new ArrayList<String>();
    		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    
    		try 
    		{
    				 HttpClient httpclient = new DefaultHttpClient();	   
    				 HttpPost httppost = new HttpPost(param[0]);
    				 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    				 HttpResponse response = httpclient.execute(httppost);	   
    				 if (response.getStatusLine().getStatusCode() < 400) 
    				 {
    					  HttpEntity entity = response.getEntity();
    					  String entityStr = EntityUtils.toString(entity);
    					  JSONArray json_array = new JSONArray(entityStr);
    					
    					  for(int i=0;i<json_array.length();i++) 
    					  {
    						  JSONObject json_ligne = json_array.getJSONObject(i);                            
    						  listeAffichageVille.add(json_ligne.getString("VILLE"));
    						  a_idVil.add(json_ligne.getString("CLEF_VILLE"));
    					  }
    				} 
    				else 
    				{
    					Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION http error *****", "--"+response.getStatusLine().toString()+"--"); 
    					this.errorMsgId = R.string.http_site_error;
    					listeAffichageVille = null;
    				}
    		} 
    		catch (Exception ex) 
    		{
    				Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION decode error *****", "--"+ex.toString()+"--");
    				this.errorMsgId = R.string.http_decode_error;
    				this.errorMsgParam = ex.getLocalizedMessage();
    				listeAffichageVille = null;
    		}
    		return listeAffichageVille;
    	}
    	
    	protected void onProgressUpdate(String... item)	{	}
    	protected void onPreExecute(List<String> list)	{	}
    	protected void onPostExecute(List<String> list)		
    	{				
    		if (list == null)	//si NULL alors problème...
    		{
    			  if (this.errorMsgId != null) 
    			  {
    				  String msg = TestActivity.this.getString(this.errorMsgId);
    				  Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show();
    			  }    
    		}
    		else				//.. SINON affecter les data à l'adapter!
    		{
    			ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list));
    		}
    	}	
    }
    fonctionnement dégradé:
    -> il faut saisir enoughToFilter + 1 caractères pour afficher la liste des villes débutant par ces 4+1 caractères(?)
    -> on ne passe plus dans le listener(?)


    J'ai déjà reprise le déroulement du code un bon paquet de fois, mais je ne vois pas!

    Et comme à force je connais trop bien mon source, de toute façon je ne lis plus vraiment, je survole!

    En fait enoughToFilter fonctionne bien, il déclenche bien l'exécution de la classe RemplirVille=, qui fait bien son taff aussi (rqt, data ok) sauf que l'affichage de la liste des villes ne se fait pas!

    Du coup, comme la liste ne s'affiche pas, on saisi 1 car de plus:
    -> enoughToFilter toujours ok puisqu'on est à min+1
    -> RemplirVille refait la rqt, ramène encore une fois les data.... et cette fois-ci, oh miracle, affiche bien la liste de choix.

  8. #48
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Salut,

    Je déterre brièvement ce vieux topic pour une question de android:textSize!

    En effet, la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android:textSize="30sp"
    est absolument sans effet sur le contenu du spinner alors que je voudrais augmenter la taille des items affichés par le spinner.

    Que je précise ou pas d'ailleurs un text size, c'est comme s'il prenait 1 valeur par défaut, toujours la même!

    J'optimise mon appli avec des template xlarge, large, normal & small.
    Et sur ma galaxy tab, le contenu des spinners est vraiment tout petit...

    Pour avoir déjà cherché en ligne, il semblerait que ce soit bien la commande adéquate, sauf qu'elle est sans effet chez moi...

    Une idée?

  9. #49
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    On pourrait voir la définition XML du layout des items ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #50
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Of course:

    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
     
    <?xml version="1.0" encoding="utf-8"?>
     
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/tableLayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/bois"
        android:orientation="vertical"
        android:stretchColumns="1" >
     
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="logo"
            android:src="@drawable/logo2" />
     
    	<TableRow>
            <AutoCompleteTextView
                android:id="@+id/ville"
                android:layout_width="fill_parent"
                android:layout_height="75dp"
                android:layout_span="3"
                android:hint="@string/choix_ville"
                android:contentDescription="@string/choix_ville"
                android:inputType="textCapSentences"
            	android:singleLine="true"
            	android:completionThreshold="4"
            	android:textSize="30sp"
            	android:textColor="#000000"
             />
        </TableRow>
     
       <TableRow>
    	   <Button
    	        android:id="@+id/geoloc"
    	        android:layout_column="1"
    	        android:layout_width="fill_parent"
    	        android:layout_height="75dp"
    	        android:textSize="30sp"
    	        android:layout_span="3"
    	        android:onClick="geoloc"
    	        android:text="@string/bouton_geoloc" />
        </TableRow>
     
        <TextView
            android:id="@+id/textView1"
            android:textSize="30sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Département : extra large"
            android:textAppearance="?android:attr/textAppearanceMedium" />
     
    	<Spinner
    	    android:id="@+id/spinner1"
    	    android:layout_width="fill_parent"
    	    android:layout_height="75dp"
    	    android:textSize="30sp"
    	    android:textAppearance="?android:attr/textAppearanceLarge"
    	    android:drawSelectorOnTop="true"
            android:contentDescription="@string/choix_departement"
            android:prompt="@string/choix_departement"
    	    tools:listitem="@android:layout/simple_spinner_item" 
    	/>
     
    </TableLayout>
    Et en postant ce code je m'aperçois que le spinner en question n'est pas ds un <table row>........

    C'est pas aussi con que ça qd même?
    (test en cours, mais mon Eclispe râme là...)

  11. #51
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Non ca c'est le layout de ton activité....
    Je te parle du layout des ITEMS du spinner....
    Que tu dois passer en paramètre à l'Adapter.... c'est le layout des items qu'il faut modifier...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  12. #52
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    aaaah ok!

    en fait j'utilise le standard, pas du maison pour ce coup là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ArrayAdapter<String> aaD = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, listeAffichageSpinner1);
    spinner1.setAdapter(aaD);

  13. #53
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ben voilà... si c'est celui par défaut, les items auront tous le style "?android:attr/textAppearanceMedium"

    Il y a 3 manières de gérer cela:

    1. La plus directe: faire un simple layout qui ne contient qu'un TextView (je crois que le spinner n'a besoin que de ca) avec comme ID "@android:id/text", et modifier le textSize dedans. Utiliser ce layout à la place de celui par défaut dans l'adapter.

    2. La même avec des styles... définir un style de "textAppearance" à soi avec la bonne taille, et utiliser ce style pour le TextView ci-dessus.
    Avantage: réutilisation dans toute l'application du style en 1s...

    3. Avec un thème... Dans le thème de l'application, définir l'attribut "android:textAppearanceMedium" sur le style défini en (2), et ne rien changer (continuer d'utiliser le layout android par défaut).
    Avantage: Plus besoin de faire quoique ce soit, tous les text-view "medium" auront le nouveau style, visible directement depuis l'éditeur d'interface.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  14. #54
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, je vais voir ça alors.
    Merci.

    PS: cela dit l'attribut TextSize d'un spinner est débile alors et ne sert à rien(?)...

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

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