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

Android Discussion :

Nouvelle activité sur OnItemClickListener Gridview


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Nouvelle activité sur OnItemClickListener Gridview
    Bonjour à tous, j'ai créé une listview qui fonctionne plutôt pas mal mais impossible d'adapter mon code pour une Gridview

    Voici l'activite principale:

    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
    public class sg_menu extends ListActivity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.sg_menu);
     
            Context ctx = getApplicationContext();
    		Resources res = ctx.getResources();
     
    		String[] options = res.getStringArray(R.array.noms);
    		TypedArray icons = res.obtainTypedArray(R.array.icones);
     
    		setListAdapter(new ImageAndTextAdapter(ctx, R.layout.list_icons,
    				options, icons));
        }
     
        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            Intent intent = null;
            switch (position) {
            case 0:
                intent = new Intent(this, sg_1.class);
                break;
            case 1:
                intent = new Intent(this, sg_2.class);
                break;
            case 2:
                intent = new Intent(this, sg_3.class);
                break;
            }
            if (intent != null) {
                startActivity(intent);
            } else {
                // report unknown item selection
            }
        }
    }
    L'adapter:

    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
    public class ImageAndTextAdapter extends ArrayAdapter<String> {
    	private LayoutInflater mInflater;	
    	private String[] mStrings;
    	private TypedArray mIcons;	
    	private int mViewResourceId;
     
    	public ImageAndTextAdapter(Context ctx, int viewResourceId,
    			String[] strings, TypedArray icons) {
    		super(ctx, viewResourceId, strings);
     
    		mInflater = (LayoutInflater)ctx.getSystemService(
    				Context.LAYOUT_INFLATER_SERVICE);
     
    		mStrings = strings;
    		mIcons = icons;
     
    		mViewResourceId = viewResourceId;
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		convertView = mInflater.inflate(mViewResourceId, null);
     
    		ImageView iv = (ImageView)convertView.findViewById(R.id.icon);
    		iv.setImageDrawable(mIcons.getDrawable(position));
     
    		TextView tv = (TextView)convertView.findViewById(R.id.text);
    		tv.setText(mStrings[position]);
     
    		return convertView;
    	}	
    }
    Mes layout possèdent une image et un texte, dont les données sont stockées dans un array de "values/string.xml"

    Donc ça fonctionne très bien pour une listview, mais rien à faire pour une GridView! J'ai essayé avec :

    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
       public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.grid_layout);
     
            GridView gridView = (GridView) findViewById(R.id.grid_view);
     
            // Instance of ImageAdapter Class
            gridView.setAdapter(new ImageAdapter(this));
     
            /**
             * On Click event for Single Gridview Item
             * */
            gridView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View v,
                        int position, long id) {
     
                    // Sending image id to FullScreenActivity
                    Intent i = new Intent(getApplicationContext(), FullImageActivity.class);
                    // passing array index
                    i.putExtra("id", position);
                    startActivity(i);
                }
            });
    mais impossible d'adapter le code pour garder le fonctionnement du click suivant l'item cliqué.

    Je bloque vraiment, vous avez une idée s'il vous plait? Merci d'avance

  2. #2
    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
    Qu'est ce qui ne marche pas ?

    Sinon, Eclipse n'a rien dit pour les layout des items ? parceque Image+Text = TextView seul (il est possible de coller une image a droite, gauche, bas, haut à un TextView => c'est comme ça que sont fait les checkbox).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Bonjour

    Qu'est ce qui ne marche pas ?

    Ma listview fonctionne très bien, mais je n'arrive pas à mettre en place les liens vers des activités lors de click sur des items dans la gridview.

    Les 2 premiers codes que j'ai posté ci-dessus sont ceux de la listview, j'aimerai que vous m'indiquiez comment l'adapter pour avoir le même fonctionnement avec ma grille, tout simplement.

    Sinon, Eclipse n'a rien dit pour les layout des items ? parceque Image+Text = TextView seul (il est possible de coller une image a droite, gauche, bas, haut à un TextView => c'est comme ça que sont fait les checkbox).
    En fait, ma listview et ma gridview "appellent" un layout constitué d'un text et d'une image, pas de problème d'affichage sur mon device, j'ai bien mes listes et mes grille, sauf que le liens ne fonctionnent pas sur la grille.

    Merci pour vos conseils!

  4. #4
    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
    Citation Envoyé par dusty35 Voir le message
    Ma listview fonctionne très bien, mais je n'arrive pas à mettre en place les liens vers des activités lors de click sur des items dans la gridview.
    Non mais j'ai bien compris.... mais c'est quoi qui ne marche pas ?
    Le OnItemClickListener n'est pas appelé ?
    L'intent n'est pas lancé ?
    L'activité n'est pas affichée ?
    L'application ferme ?

    Sinon, j'ai vu aussi l'utilisation de getApplicationContext() ... pourquoi ? un simple MyActivity.this suffirait je pense (remplacer MyActivity bien sur)

    Les 2 premiers codes que j'ai posté ci-dessus sont ceux de la listview, j'aimerai que vous m'indiquiez comment l'adapter pour avoir le même fonctionnement avec ma grille, tout simplement.
    C'est ça justement le hic... normalement c'est tout pareil !

    En fait, ma listview et ma gridview "appellent" un layout constitué d'un text et d'une image, pas de problème d'affichage sur mon device, j'ai bien mes listes et mes grille, sauf que le liens ne fonctionnent pas sur la grille.
    Oui oui, mais normalement, quand on colle dans un layout une ImageView et un TextView collé à lui, Lint (par l'intermédiaire d'eclipse) râle en disant que ce n'est pas utile.... A juste titre.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Non mais j'ai bien compris.... mais c'est quoi qui ne marche pas ?
    Le OnItemClickListener n'est pas appelé ?
    L'intent n'est pas lancé ?
    L'activité n'est pas affichée ?
    L'application ferme ?
    L'application ferme au moment du click sur l'item

    Sinon, j'ai vu aussi l'utilisation de getApplicationContext() ... pourquoi ? un simple MyActivity.this suffirait je pense (remplacer MyActivity bien sur)
    En réalité, ce bout de code ne correspond pas, je l'ai trouvé sur un site mais d'une manière générale, je débute et j'ai du mal à tout comprendre.

    C'est ça justement le hic... normalement c'est tout pareil !
    Quand tu dis tout pareil, c'est tout pareil? Je vais revoir ce soir pour préciser quelles sont les erreurs et je reposterai plus en détail.


    Oui oui, mais normalement, quand on colle dans un layout une ImageView et un TextView collé à lui, Lint (par l'intermédiaire d'eclipse) râle en disant que ce n'est pas utile.... A juste titre.
    Ah ok, c'est bon à savoir,je me pencherait là dessus.

    En tout cas, merci de intéresser à mon problème

  6. #6
    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
    Citation Envoyé par dusty35 Voir le message
    L'application ferme au moment du click sur l'item
    Donc il y a une exception...
    Si il y a exception, il y a un logcat
    Si il y a un logcat, il nous faut la copie (enfin... toute l'exception et ses causes quoi).

    Quand tu dis tout pareil, c'est tout pareil? Je vais revoir ce soir pour préciser quelles sont les erreurs et je reposterai plus en détail.
    Ha ben oui, c'est tout pareil....
    Tu changes GridView par ListView et ca continue de marcher...
    Pour être encore plus "générique"... le code pourrait simplement utiliser un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AdapterView av = (AdapterView) findViewById(...);
    av.setAdapter(adapter);
    av.setOnItemClickListener(...);
    Et le XML définit si c'est un GridView, ListView, ou Spinner.... bref, pour le code c'est tout pareil.
    C'est d'ailleurs la méthode recommandée en POO... vu qu'on n'utilise que les fonctionalités d'un AdapterView, c'est un objet AdapterView qui est référencé (peut importe son implémentation)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Dans mon activité de type listview (qui fonctionne):

    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
    public class menu_grid extends ListActivity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listview);
     
            Context ctx = getApplicationContext();
    		Resources res = ctx.getResources();
     
    		String[] options = res.getStringArray(R.array.noms);
    		TypedArray icons = res.obtainTypedArray(R.array.icone);
     
    		setListAdapter(new ImageAndTextAdapter(ctx, R.layout.ico_list,
    				options, icons));
        }
    J'ai remplacé la ligne 6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setContentView(R.layout.listview);
    mon listview.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    </LinearLayout>
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setContentView(R.layout.gridview);
    Mon gridview.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8"?>
    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/GridView"
        android:numColumns="auto_fit"
        android:gravity="center"
        android:columnWidth="50dp"
        android:stretchMode="columnWidth"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" > 
    </GridView>
    Voici le logcat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    01-07 19:21:50.975: E/SpannableStringBuilder(16754): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
    01-07 19:21:50.975: E/SpannableStringBuilder(16754): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
    01-07 19:21:52.065: D/AbsListView(16754): Get MotionRecognitionManager
    01-07 19:21:52.065: D/AndroidRuntime(16754): Shutting down VM
    01-07 19:21:52.065: W/dalvikvm(16754): threadid=1: thread exiting with uncaught exception (group=0x410bd2a0)
    01-07 19:21:52.075: E/AndroidRuntime(16754): FATAL EXCEPTION: main
    01-07 19:21:52.075: E/AndroidRuntime(16754): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.monappli/com.example.monappli.menu_grid}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
    01-07 19:21:52.075: E/AndroidRuntime(16754): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
    ...
    01-07 19:21:52.075: E/AndroidRuntime(16754): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
    01-07 19:21:52.075: E/AndroidRuntime(16754): 	at dalvik.system.NativeStart.main(Native Method)
    01-07 19:21:52.075: E/AndroidRuntime(16754): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id
    Ce ne doit surement pas être grand chose mais là, je ne vois pas!

  8. #8
    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 mais là tu hérites de ListActivity, une Activity qui attend d'avoir dans le layout une ListView (et uniqument ça) avec comme identifiant "android.R.id.list"...
    D'ailleurs le logcat (il en manque d'ailleurs une partie hein ! ) le dit bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Caused by: java.lang.RuntimeException: Your content must have a ListView whose id is android:id/list

    ListActivity est à éviter si tu veux pouvoir changer de Grid à ListVuew...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'ai bien essayé de remplacer extends ListActivity par extends Activity et eclipse me propose de redéfinir setlisadapter, ce que je fais et là, plus de plantage, ça fonctionne sans erreur mais pas de grille affichée, page blanche.

    J'ai également changé l'ID pour un truc du genre"android:id/list" et le message d'erreur est du genre (de tête) : "Error: android.widget.ListView cannot be cast to android.widget...."

    Tu pourrais me dire concrètement les lignes qu'il faut adapter parceque là je ne vois plus quoi faire!

  10. #10
    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
    Bon... il va falloir lire un peu de documentation peut-être

    En fait... voila le code d'un AdapterView sur une activité "normale"...
    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
     
    class MyActivity extends Activity implements OnItemClickListener
    { 
         ListAdapter   listAdapter;
     
         @Override
         public void onCreate(...)
         {
               super.onCreate(...);
               setContentView(R.layout.xxxx); // le layout contient "R.id.adapterView"
     
               this.listAdapter = ...; // construction de l'adapter
               AdapterView av = (AdapterView) findViewById(R.id.adapterView);
               av.setAdapter(this.listAdapter);
               av.setOnItemClickListener(this);
         }
     
     
         public void onItemClick(...)
         {
               this.listAdapter.getItem(position); ....
         }
    }
    et le code "ListActivity"
    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
     
    class MyActivity extends ListActivity
    {
         @Override
         public void onCreate(...)
         {
               super.onCreate(...);
               setContentView(R.layout.xxxx); // le layout contient "android.R.id.list"
     
               Adapter   myAdapter = ...; // construction de l'adapter
               setListAdapter(myAdapter);
         }
     
         @Override
         public void onItemClick()
         {
               getListAdapter().getItem(position); ....
         }
    }
    Comme tu peux le constater, la différence n'est pas flagrante
    D'ailleurs il y a très peu de code dans ListActivity (ou ListFragment). Juste la conservation de l'adapter, et la récupération de la view quand nécessaire... donc quasiment rien.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Bon bah j'arrive à rien c'est pas possible

    Mon appli est relativement simple et je bloque presque plus que là dessus... Je t'avoue que j'ai vraiment du mal à assimiler la doc car c'est particulièrement imbuvable pour un débutant (qui souhaite le rester).

    Si certains pro sentent une menace dans les nouveaux développeurs, aucun risque !

    Je souhaite juste afficher dans une grille, des textes se trouvant dans un string.xml, associés à leurs icones. Puis simplement pouvoir cliquer sur ces items pour lancer l'activité adéquate.

    C'est pas un coup de gueule mais je trouve ça incroyable de ne pas trouver un exemple concret sur un sujet si "commun" que sont les gridviews.

    Je ne désespère pas mais... bah si en fait, je désespère

  12. #12
    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
    Bon... quel est le code complet de ton activité dans l'état actuel (avec dépendances XML) ?
    Et qu'est ce qui ne marche pas ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Bon... quel est le code complet de ton activité dans l'état actuel (avec dépendances XML) ?
    Et qu'est ce qui ne marche pas ?
    Merci nicroman

    J'ai une activité principale mais elle n'a pas d’intérêt dans l'état actuel des choses.

    J'ai donc ma page avec les différents liens sous forme de liste sg_menu.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
    44
    45
    46
    47
    48
    49
    50
    51
     
    package com.example.monappli;
     
    import android.app.ListActivity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.res.Resources;
    import android.content.res.TypedArray;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ListView;
     
    public class sg_menu extends ListActivity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listview);
     
            Context ctx = getApplicationContext();
    		Resources res = ctx.getResources();
     
    		String[] options = res.getStringArray(R.array.noms_etats);
    		TypedArray icons = res.obtainTypedArray(R.array.icones_etats);
     
    		setListAdapter(new ImageAndTextAdapter(ctx, R.layout.list_icons,
    				options, icons));
        }
    //affiche la nouvelle activite en fonction du case cliqué : dans l ordre de la liste
        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            Intent intent = null;
            switch (position) {
            case 0:
                intent = new Intent(this, activite1.class);
                break;
                //ajouter ci dessous tous les case de AG
            case 1:
                intent = new Intent(this, activite2.class);
                break;
            case 2:
                intent = new Intent(this, activite3.class);
                break;
            }
            if (intent != null) {
                startActivity(intent);
            } else {
                // report unknown item selection
            }
        }
    }
    Mon layout list

    listview.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
     
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
     
    </LinearLayout>
    le layout de l'adapter:

    list_icons.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
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
     
        <ImageView
            android:id="@+id/option_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/marging_img" />
     
        <TextView
            android:id="@+id/option_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:textColor="@color/TextBlack"
            android:textSize="@dimen/titres" >
     
        </TextView>
    </LinearLayout>
    string.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
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="noms_etats">
            <item>Arizona</item>
            <item>Californie</item>
            <item>Colorado</item>
            <item>Nevada</item>
            <item>Nouveau Mexique</item>
            <item>Utah</item>
            <item>Wyoming</item>
        </string-array>
     
        <array name="icones_etats">
            <item>@drawable/flag_arizona</item>
            <item>@drawable/flag_californie</item>
            <item>@drawable/flag_colorado</item>
            <item>@drawable/flag_nevada</item>
            <item>@drawable/flag_nouveau_mexique</item>
            <item>@drawable/flag_utah</item>
            <item>@drawable/flag_wyoming</item>
        </array>       
     
    </resources>
    L'adapter:

    ImageAndTextAdapter.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.example.monappli;
     
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
     
    public class ImageAndTextAdapter extends ArrayAdapter<String> {
    	private LayoutInflater mInflater;	
    	private String[] mStrings;
    	private TypedArray mIcons;	
    	private int mViewResourceId;
     
    	public ImageAndTextAdapter(Context ctx, int viewResourceId,
    			String[] strings, TypedArray icons) {
    		super(ctx, viewResourceId, strings);
     
    		mInflater = (LayoutInflater)ctx.getSystemService(
    				Context.LAYOUT_INFLATER_SERVICE);
     
    		mStrings = strings;
    		mIcons = icons;
     
    		mViewResourceId = viewResourceId;
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		convertView = mInflater.inflate(mViewResourceId, null);
     
    		ImageView iv = (ImageView)convertView.findViewById(R.id.option_icon);
    		iv.setImageDrawable(mIcons.getDrawable(position));
     
    		TextView tv = (TextView)convertView.findViewById(R.id.option_text);
    		tv.setText(mStrings[position]);
     
    		return convertView;
    	}	
    }
    J'ai bien renseigné toute les activités dans le manifest

    Jusque là, pas de soucis, chaque lien fonctionne suivant les cas énumérés dans sg_menu.java (cas 1/2/3/...)

    Maintenant, j'essaye simplement de changer la forme de mon layout pour afficher mes items sous forme de grille, avec pour layout:

    grille.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8"?>
    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/GridView"
        android:numColumns="auto_fit"
        android:gravity="center"
        android:columnWidth="50dp"
        android:stretchMode="columnWidth"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" > 
    </GridView>
    Puis j'ai changé mon activité en pointant vers ce xml et ça ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Caused by: java.lang.RuntimeException: Your content must have a ListView whose id is android:id/list
    C'est donc (bêtement) là que je suis bloqué, j'ai changé l'id dans ma gridview par celui indiqué dans l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android:id="@android:id/list"
    mais forcément, ça ne fonctionne pas. L’erreur du logcat est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    E/AndroidRuntime(21587): Caused by: java.lang.ClassCastException: android.widget.GridView cannot be cast to android.widget.ListView
    Voilà, toute les sources sont là, je suis sur que ça ne doit pas être grand chose mais ça ne me saute pas aux yeux.

    Merci encore!

  14. #14
    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
    Encore une fois... si tu utilises "ListActivity" tu DOIS avoir un ListView (et uniquement cela) avec comme identifiant "@android:id/list" dans le XML. C'est des les prerequis de la classe (http://developer.android.com/referen...tActivity.html :
    To do this, your own view MUST contain a ListView object with the id "@android:id/list" (or list if it's in code)).

    Ce n'est pas le cas avec grille.xml => les erreurs que tu as.


    Si tu veux passer à autre chose (GridView par exemple):
    1. Commencer par ne plus utiliser ListActivity (et hériter de Activity tout court)
    2. Adapter le code (j'ai filé les modification dans un message précédent).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Bon bah non, y'a rien à faire, désolé mais je n'y arrive pas

    J'ai tout essayé, surtout n'importe quoi et j'arrive pas à ne plus avoir d'erreur.

    J'ai des bases vraiment minimale en java. Je comprend bien le principe global des activités, les ressources, etc.. mais là, dans le code pur et dur, c'est pas mon truc...

    Je t'assure que je ne suis pas du genre à demander un travail tout fait mais ça m’agace sérieusement d'être bloqué sur un truc si "con" alors que l'architecture de mon appli ne repose quasiment que sur des listes et des grilles et j'ai envie de tout sauf de me "taper" des dizaines d'heures de lecture de doc pour ce malheureux point bloquant

    Tu veux vraiment me laisser chercher (galérer) ou tu veux bien m'écrire les quelques lignes nécessaires.

  16. #16
    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 mais je l'ai collé le code... hier à 12h58 !!!
    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
     
    class MyActivity extends Activity implements OnItemClickListener
    { 
         ListAdapter   listAdapter;
     
         @Override
         public void onCreate(...)
         {
               super.onCreate(...);
               setContentView(R.layout.xxxx); // le layout contient "R.id.adapterView"
     
               this.listAdapter = ...; // construction de l'adapter
               AdapterView av = (AdapterView) findViewById(R.id.adapterView);
               av.setAdapter(this.listAdapter);
               av.setOnItemClickListener(this);
         }
     
     
         public void onItemClick(...)
         {
               this.listAdapter.getItem(position); ....
         }
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'ai bien vu ça hier, pas de soucis et je viens même d'essayer de l’insérer mais je suis incapable de placer le bon code dans tes (...)
    Ça ne sert à rien que je te montre ce que j'ai fait car ça ne ressemble à rien.

    je suis un boulet

  18. #18
    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
    C'est ce qui m'inquiete....
    La différence avec ton code, il y a pas grand code:
    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
    package com.example.monappli;
     
    import android.app.ListActivity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.res.Resources;
    import android.content.res.TypedArray;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ListView;
     
    // NB: En java on un type (donc une classe) commence par une majuscule, et on n'utilise jamais '_', par contre on fait du "camel-case" comme ici:  "SgMenu" au lieu de sg_menu
    public class SgMenu extends Activity implements OnItemClickListener {
    
        ImageAndTextAdapter adapter; // on va vouloir stocker l'adapter
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listview); // ou gridView peut importe tant qu'il y a un "R.id.adapterView" dedans...
     
            // Context ctx = getApplicationContext(); // INUTILE !
    
            Resources res = ctx.getResources();
     
    	String[] options = res.getStringArray(R.array.noms_etats);
    	TypedArray icons = res.obtainTypedArray(R.array.icones_etats);
     
            this.adapter = new ImageAndTextAdapter(this, R.layout.list_icons, options, icons);
            AdapterView av = (AdapterView) findViewById(R.id.adapterView);
            av.setAdapter(this.adapter); // on enregistre le contenu
            av.setOnItemClickListener(this); // on enregistre l'activité comme voulant recevoir les clicks.
        }
    
        //affiche la nouvelle activite en fonction du case cliqué : dans l ordre de la liste
        // le nom de la fonction change légerement mais c'est tout
        @Override
        protected void onItemClick(AdapterView<?> av, View v, int position, long id) {
            Intent intent = null;
            switch (position) {
            case 0:
                intent = new Intent(this, activite1.class); // encore des classes qui commencent par une minuscule !
                break;
                //ajouter ci dessous tous les case de AG
            case 1:
                intent = new Intent(this, activite2.class); // encore des classes qui commencent par une minuscule !
                break;
            case 2:
                intent = new Intent(this, activite3.class); // encore des classes qui commencent par une minuscule !
                break;
            }
            if (intent != null) {
                startActivity(intent);
            } else {
                // report unknown item selection
            }
        }
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Ca fonctionne presque :

    A la ligne 13:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The type SgMenu must implement the inherited abstract method AdapterView.OnItemClickListener.onItemClick(AdapterView<?>, View, int, long)	SgMenu.java	/SunsetBld/src/com/example/monappli
    J'ai donc modifié en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extends Activity implements OnItemClickListener
    lignes 27/28
    ce qui n'est pas le cas si je dé-commente les 2 lignes précédentes.

    J'ai également du enlever le @override à la ligne 38 pour qu'il n'y ai plus d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The method onItemClick(ListView, View, int, long) of type SgMenu must override or implement a supertype method
    (surement lié au premier point ci dessus

    Avec ces modifications La grille s'affiche mais les liens ne fonctionnent pas (pas de crash pour autant)

  20. #20
    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
    Il suffit de modifier la fonction pour prendre les bons paramètres

    Si Eclipse rale sur un @Override c'est que la signature de la fonction n'est pas bonne.

    J'ai modifié mon code... mais bon, eclipse n'est pas avare en explications concernant les erreurs.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/11/2014, 18h50
  2. [VB.NET] Problème de tri sur Datagrid/gridview multilingue
    Par crimsonPhantom dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/03/2006, 22h41
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. [formulaire] nouvel enregistrement sur molette
    Par xanthos1348 dans le forum IHM
    Réponses: 5
    Dernier message: 04/01/2006, 00h56
  5. [Static] nouvelle question sur les blocs static
    Par Alec6 dans le forum Langage
    Réponses: 2
    Dernier message: 25/11/2004, 18h09

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