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 :

Problème enum et tableau (accès aux variables)


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut Problème enum et tableau (accès aux variables)
    Bonjour, précédemment on m'a conseillé d'utiliser les énumérations pour mes déclaration de variables.
    Le seul soucis est que comme à chaque solution cela pose un problème un peu plus loin.

    J'ai mes 2 énumérations:

    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
    enum ButtonId{
    		mButtonAll(R.id.all),
    		mButtonQuot(R.id.quot),
    		mButtonHebd(R.id.hebd),
    		mButtonMens(R.id.mens),
    		mButtontrim(R.id.trim),
    		mButtonAnn(R.id.ann);
     
    		private int resId;
    		private ButtonId(int r){
    			this.resId = r;
    		}
    		public int getResId(){
    			return this.resId;
    		}	
    	}
     
    	enum ListViewId{
    		mListViewAll(R.id.ListViewAll),
    		mListViewQuot(R.id.ListViewQuot),
    		mListViewHebd(R.id.ListViewHebd),
    		mListViewMens(R.id.ListViewMens),
    		mListViewTrim(R.id.ListViewTrim),
    		mListViewAnn(R.id.ListViewAnn);
     
    		private int resId;
    		private ListViewId(int r){
    			this.resId = r;
    		}
    		public int getResId(){
    			return this.resId;
    		}
    	}
    Et ensuite j'ai leur utilisation:
    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
    ListViewId[] listViewId = ListViewId.values();
    		final ListView[] listViewMap = new ListView[listViewId.length];
    		for (int i = 0; (i < listViewId.length); ++i){
    		    listViewMap[i] = (ListView) v.findViewById(listViewId[i].getResId());
    		    listViewMap[i].setOnItemClickListener(new OnItemClickListener(){
     
    				public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    					// TODO Auto-generated method stub
    					String choix = mDataAll.get(position);
    					Bundle mObjetBundle = new Bundle(); //Permet de passer un paramètre à l'autre activité
    					mObjetBundle.putString("choix", choix);
    					Intent t = new Intent(getActivity(), Tableau.class); //permet d'appeler la nouvelle activité
    					t.putExtras(mObjetBundle);
    					startActivity(t);	
    			}});
    		}
     
    ButtonId[] buttonId = ButtonId.values();
    		Button[] buttonMap = new Button[buttonId.length];
    		for (int i = 0; (i < buttonId.length); ++i){
    		    buttonMap[i] = (Button) v.findViewById(buttonId[i].getResId());
    			buttonMap[i].setOnClickListener(new View.OnClickListener() {
     
    				public void onClick(View v) {
    					// TODO Auto-generated method stub
    					if(listViewMap[i].isShown()){
    						listViewMap[i].setVisibility(View.GONE);
    					}
    					else{
    						listViewMap[i].setVisibility(View.VISIBLE);
    					}
    				}
    			});
    		}
    Le problème c'est déjà pour la partie pour rendre la liste visible ou non il aime pas trop la syntaxe avec le tableau listViewMap[i]:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void onClick(View v) {
    					// TODO Auto-generated method stub
    					if(listViewMap[i].isShown()){
    						listViewMap[i].setVisibility(View.GONE);
    					}
    					else{
    						listViewMap[i].setVisibility(View.VISIBLE);
    					}
    				}
    Et par la suite j'ai mes variable mDataAll qui sont des arrayList donc je ne vois pas comment rendre l'initialisation dynamique pour ensuite l'utiliser sans cette partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    					// TODO Auto-generated method stub
    					String choix = mDataAll.get(position);
    					Bundle mObjetBundle = new Bundle(); //Permet de passer un paramètre à l'autre activité
    					mObjetBundle.putString("choix", choix);
    					Intent t = new Intent(getActivity(), Tableau.class); //permet d'appeler la nouvelle activité
    					t.putExtras(mObjetBundle);
    					startActivity(t);	
    				}});

    Voilà en espérant que vous pourrez m'aider ^^

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Personne ne sait répondre? :s
    J'ai aussi un souci avec les visibilités de mes éléments, impossible de faire tabVar[i].isShown() car la variable n'est pas finale.
    Donc en gros tout ce que j'ai fait avant ça ne sert à rien :s (limite de java/android ou possibilité de solution?)

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    C'est juste que tu n'as pas correctement intégré les notions de scope de java.


    Les endroits où ton problème survient sont dans la déclaration de ton Listener, qui lui te met dans le scope d'une classe anonyme et non plus celui de la classe englobante. De fait, par la définition même du langage

    un va chercher la variable listViewMap dans l'ordre suivant:

    1 Dans les variables déclarées dans la méthode courante
    2 Dans les attributs de la classe courante (équivalent à un this.
    listViewMap)

    Or listViewMap n'existe ni dans l'une, ni dans l'autre.
    Il faut donner à java le chemin pour y accéder en fait en faisant un
    MaClasseEnglobante.this.listViewMap
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Ha ok mais alors vu que c'est une classe anonyme je fais comment? la seule classe englobante connue c'est ma classe qui me sert d'activité.
    Par contre juste un doute, il me dit plutôt que la variable doit être finale quand je la lie à isShown().
    C'est pas plutôt ça le problème?

    En tout cas merci pour ta réponse, mais j'ai l'impression que le combat contre la redondance sous android n'est pas des plus simple (et même parfois pas possible)

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu n'as pas lu la dernière ligne de mon post précédent.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Ouais mais c'est là que j'ai ptet mal compris, dans ce cas c'est quoi la classe englobante?
    La seule que je suis sûr c'est la class de mon fragment mais apparemment je me trompe

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Bah ton activity.

    listViewMap étant membre de ton activity(appelont là MyActivity car tu ne donne pas le nom de celle ci dans tes exempels de code).

    Pour accéder à listViewMap dans une classe anonyme il faut procéder de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyActivity.this.listViewMap
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    C'est ce que j'avais fait, et ça foire.
    Il m'est proposé "create a field 'listViewMap' in type 'Firts' ou create constant 'listViewMap' in type 'First'

    Et bon les 2 possibilités retombent sur l'erreur que j'avais dit qu'il fallait mettre i en final ce qui n'est pas bon non plus :s

  9. #9
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Je n'avais pas vu, ta listViewMap est déclarée dans le scope d'une méthode. Donc, a moins d'être finale, elle n'a pas d'existence en dehors du scope de celle ci et sera détruite à la fin de l'exécution de celle ci.

    Or, la méthode onClick de ta classe anonyme ne sera pas exécutée pendant le déroulement de la méthode, mais bien plus tard, au moment de l'appui sur le bouton. Et à ce moment là, listViewMap n'existera plus.

    Si tu en as besoin à un moment autre que pendant l'exécution de la méthode créant le listener, il faudra faire de listViewMap un membre de ta classe.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    J'ai déjà une erreur dans le code que je n'ai pas corrigé ici.
    listViewMap n'est pas final.
    Par contre elle est déclarée dans ma boucle mais avant la méthode qui gère le listener

  11. #11
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour faire simple, définit ta propre classe héritant de View.OnClickListener, prenant en paramètre du constructeur une référence sur une ListView et utilisant cette ListView dans sa méthode onItemClick.

    Par exemple:
    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
     
    class MyListener extends OnClickListener {
        private ListView listView;
     
        public MyListener (ListView listView) {
            this.listView = listView;
        }
     
        public void onClick(View v) {
            if(listView.isShown()){
                listView.setVisibility(View.GONE);
            }
            else{
                listView.setVisibility(View.VISIBLE);
            }
        }
    }
    Puis dans ta méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buttonMap[i].setOnClickListener(new MyListener(listViewMap[i]));
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Ok je vais voir ce que ça donne en espérant que ça me débloque ^^

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Bon bah en fait c'est pas possible :s
    Mon activity est un fragment, et donc hérite de fragments.
    Et je ne peux pas utiliser d'interface dans ce cas là -_-

  14. #14
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Je ne vois pas la relation par rapport à ma proposition...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    autant pour moi, j'avais en tête de faire un héritage mais en fait ce n'est pas nécessaire

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Bon bah je ne sais pour quelle raison obscure il n'accepte pas le extends OnClickListener.
    Et sur le net je ne vois que des implement :s

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Bon voilà j'ai fait en implémentant OnClickListener mais la machine n'aime pas trop ça -_-
    En gros l'app se lance correctement mais quand le clique rien ne va plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    12-20 17:46:44.145: E/AndroidRuntime(531): FATAL EXCEPTION: main
    12-20 17:46:44.145: E/AndroidRuntime(531): java.lang.NullPointerException
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at rapport.presse.cim.MyListViewListener.onClick(MyListViewListener.java:15)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at android.view.View.performClick(View.java:3511)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at android.view.View$PerformClick.run(View.java:14105)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at android.os.Handler.handleCallback(Handler.java:605)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at android.os.Handler.dispatchMessage(Handler.java:92)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at android.os.Looper.loop(Looper.java:137)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at java.lang.reflect.Method.invokeNative(Native Method)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at java.lang.reflect.Method.invoke(Method.java:511)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    12-20 17:46:44.145: E/AndroidRuntime(531): 	at dalvik.system.NativeStart.main(Native Method)

  18. #18
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rapport.presse.cim.MyListViewListener.onClick(MyListViewListener.java:15)
    Tu as une variable ayant une valeur de "null" dans ta classe rapport.presse.cim.MyListViewListener, à la ligne 15.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    En fait l'erreur a changé mais c'est sans doute pasque il y a encore des bouts de code qui ne sont pas codé en fonction de mes tableaux.
    Par contre y-a-t-il un moyen de faire un tableau d'ArrayList et ArrayAdapter? (normalement non mais il doit sûrement y avoir une astuce).

  20. #20
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ce sont des choses différentes. Un ArrayList est un simple conteneur. Un ArrayAdapter est un contrôleur pour des données.

    Si tu désirs une liste contenant les deux, tu dois avoir un grave problème de conception (ou un besoin qui m'échappe totalement).
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 09/08/2006, 13h03
  2. Acces aux variables d'une DLL
    Par abignon dans le forum MFC
    Réponses: 1
    Dernier message: 08/09/2005, 14h29
  3. [C#] Accès aux variables Session
    Par kalan dans le forum ASP.NET
    Réponses: 9
    Dernier message: 31/08/2005, 16h40
  4. [FLASH MX2004] [AS2] Accès aux variables d'une classe
    Par stailer dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 17/07/2005, 12h58
  5. [Language]Accès aux variables
    Par Adaemon dans le forum Langage
    Réponses: 12
    Dernier message: 27/04/2005, 14h17

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