Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Java & Mobiles > Android
Android Forum d'entraide sur Android, la plateforme mobile de Google pour téléphones portables et Smartphones. Avant de poster -> FAQ Android
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/12/2012, 19h09   #1
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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 ^^
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h56   #2
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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?)
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 16h08   #3
sinok
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 661
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 661
Points : 12 474
Points : 12 474
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.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 16h36   #4
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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)
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 03h53   #5
sinok
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 661
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 661
Points : 12 474
Points : 12 474
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.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 12h56   #6
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 13h09   #7
sinok
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 661
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 661
Points : 12 474
Points : 12 474
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.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 13h15   #8
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h06   #9
sinok
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 661
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 661
Points : 12 474
Points : 12 474
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.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h21   #10
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h52   #11
sinok
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 661
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 661
Points : 12 474
Points : 12 474
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.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h56   #12
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
Ok je vais voir ce que ça donne en espérant que ça me débloque ^^
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 18h18   #13
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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à -_-
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 18h22   #14
sinok
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 661
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 661
Points : 12 474
Points : 12 474
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.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 18h25   #15
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
autant pour moi, j'avais en tête de faire un héritage mais en fait ce n'est pas nécessaire
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 18h37   #16
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 18h48   #17
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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)
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 20h22   #18
Hizin
Membre Expert
 
Avatar de Hizin
 
Homme
Développeur mobile
Inscription : février 2010
Messages : 791
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur mobile

Informations forums :
Inscription : février 2010
Messages : 791
Points : 1 660
Points : 1 660
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.
__________________
Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.
Hizin est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 10h04   #19
vangoeth
Nouveau Membre du Club
 
Homme
Inscription : juillet 2012
Messages : 137
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : juillet 2012
Messages : 137
Points : 36
Points : 36
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).
vangoeth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 10h10   #20
Hizin
Membre Expert
 
Avatar de Hizin
 
Homme
Développeur mobile
Inscription : février 2010
Messages : 791
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur mobile

Informations forums :
Inscription : février 2010
Messages : 791
Points : 1 660
Points : 1 660
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).
__________________
Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.
Hizin est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h32.


 
 
 
 
Partenaires

Hébergement Web