Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 25
  1. #1
    Nouveau 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 : 38
    Points
    38

    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 :
    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 :
    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 :
    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 :
    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
    Nouveau 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 : 38
    Points
    38

    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 762
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 762
    Points : 12 849
    Points
    12 849

    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
    Nouveau 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 : 38
    Points
    38

    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 762
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 762
    Points : 12 849
    Points
    12 849

    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
    Nouveau 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 : 38
    Points
    38

    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 762
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 762
    Points : 12 849
    Points
    12 849

    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 :
    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
    Nouveau 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 : 38
    Points
    38

    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 762
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 762
    Points : 12 849
    Points
    12 849

    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
    Nouveau 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 : 38
    Points
    38

    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 762
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 762
    Points : 12 849
    Points
    12 849

    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 :
    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 :
    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
    Nouveau 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 : 38
    Points
    38

    Par défaut

    Ok je vais voir ce que ça donne en espérant que ça me débloque ^^

  13. #13
    Nouveau 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 : 38
    Points
    38

    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 762
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 762
    Points : 12 849
    Points
    12 849

    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
    Nouveau 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 : 38
    Points
    38

    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
    Nouveau 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 : 38
    Points
    38

    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
    Nouveau 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 : 38
    Points
    38

    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 :
    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
    1 526
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : février 2010
    Messages : 1 526
    Points : 3 173
    Points
    3 173

    Par défaut

    Code :
    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.

  19. #19
    Nouveau 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 : 38
    Points
    38

    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
    1 526
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : février 2010
    Messages : 1 526
    Points : 3 173
    Points
    3 173

    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.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •