Jump to content
patk29

création de menu

Recommended Posts

Bonjour,

j'apprends actuellement la programmation android d'après le livre de chez Eyrolles

une méthode tirée du bouquin pour la création des sous menus ne fonctionne pas dans l'emulateur alors que le reste des exemples du chapitre fonctionnaient.

pas d'erreur de compilation par ailleurs.

voici l'extrait du code en question :

 @Override
   public boolean onCreateOptionsMenu(Menu menu){
   	//nous créons un premier menu sous forme de sous menu
   	//les sous menu associés à ce menu seront ajoutés à ce sous menu
   	SubMenu sousMenu = menu.addSubMenu(0, MENU_PARAMETRE, Menu.NONE, "Paramètres").setIcon(R.drawable.icon);
   	sousMenu.add(0, SOUSMENU_AUDIO, Menu.NONE, "Audio").setIcon(R.drawable.icon);
   	sousMenu.add(0, SOUSMENU_VIDEO, Menu.NONE, "Video");

   	// il est possible de placer une image dans l'entete du sous menu
   	sousMenu.setHeaderIcon(R.drawable.icon);

   	// nous créons notre deuxieme menu
   	menu.add(0, MENU_QUITTER, Menu.NONE, "Quitter");

   return true;	

   }

merci de vos suggestions

Share this post


Link to post
Share on other sites

Salut!

Que dit ton LogCat au moment de lancer le menu?

Edit : J'utilise aussi ce bouquin, j'ai jeté un oeil, le code est le même que dans le livre, pas d'oubli de virgule ni quoi que ce soit...

Edit 2 : J'imagine que tu as bien déclaré tes deux constantes au début du code?

Edited by Kricek

Share this post


Link to post
Share on other sites

les variables sont bien déclarées oui.

pour le reste je n'ai pas activé logcat et à vrai dire je ne connais pas la marche a suivre ;)

Share this post


Link to post
Share on other sites

"Windows > ShowView > Other"

puis

"Android > LogCat"

Ca te donnera les messages internes au téléphone... (Erreurs, Infos, ... etc...) C'est là que tu vois quand une exception pète...

Share this post


Link to post
Share on other sites

j'ai un message du genre:

activity com.exemple.menu has leaked window com.android.internal.policy.impl....

C'est un message en rouge?

Normalement, si ton appli plante, tu dois avoir un gros bloc de plusieurs lignes rouges, avec les lignes qui sont concernees dans ton code...

Tu peux faire un copier coller de tout le bloc rouge, stp?

Share this post


Link to post
Share on other sites

11-12 05:56:55.693: ERROR/WindowManager(213): Activity com.exemple.onglets.menu has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43b903a0 that was originally added here

11-12 05:56:55.693: ERROR/WindowManager(213): android.view.WindowLeaked: Activity com.exemple.onglets.menu has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43b903a0 that was originally added here

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.ViewRoot.<init>(ViewRoot.java:227)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.Window$LocalWindowManager.addView(Window.java:424)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.app.Dialog.show(Dialog.java:239)

11-12 05:56:55.693: ERROR/WindowManager(213): at com.android.internal.view.menu.MenuDialogHelper.show(MenuDialogHelper.java:86)

11-12 05:56:55.693: ERROR/WindowManager(213): at com.android.internal.policy.impl.PhoneWindow.onSubMenuSelected(PhoneWindow.java:763)

11-12 05:56:55.693: ERROR/WindowManager(213): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:862)

11-12 05:56:55.693: ERROR/WindowManager(213): at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:525)

11-12 05:56:55.693: ERROR/WindowManager(213): at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.View.onTouchEvent(View.java:4179)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.widget.TextView.onTouchEvent(TextView.java:6540)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.View.dispatchTouchEvent(View.java:3709)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)

11-12 05:56:55.693: ERROR/WindowManager(213): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.os.Handler.dispatchMessage(Handler.java:99)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.os.Looper.loop(Looper.java:123)

11-12 05:56:55.693: ERROR/WindowManager(213): at android.app.ActivityThread.main(ActivityThread.java:4363)

11-12 05:56:55.693: ERROR/WindowManager(213): at java.lang.reflect.Method.invokeNative(Native Method)

11-12 05:56:55.693: ERROR/WindowManager(213): at java.lang.reflect.Method.invoke(Method.java:521)

11-12 05:56:55.693: ERROR/WindowManager(213): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)

11-12 05:56:55.693: ERROR/WindowManager(213): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

11-12 05:56:55.693: ERROR/WindowManager(213): at dalvik.system.NativeStart.main(Native Method)

Edited by patk29

Share this post


Link to post
Share on other sites

A quel moment intervient ton plantage?

Si tu parles anglais, j'ai trouvé ca:

Lien...

Apparemment, cela viendrait du fait que tu veux changer l'état d'une activité alors qu'elle n'est plus affichée, si j'ai bien compris...

Donc à voir où tu as placé l'appel à cette méthode...

Est ce que tu as bien tout le code de l'exemple précédent, concernant les menus? Et si oui, ou est-il placé?

EDIT :

J'ai également trouvé ca au sujet de ton erreur:

Android is communicating to you that you’ve tried to put a popup in a location that no longer exists, or you don’t have access to.

Et en creusant un peu plus, il semblerait, que tu veux fermer une popup qui l'est déjà.

Pourrais tu mettre l'intégralité de ton code en copier coller, stp?

Edited by Kricek

Share this post


Link to post
Share on other sites

je n'ai fait que suivre l'exemple du bouquin qui modifie la méthode onCreateOptions dans le code initial du bouquin p.142.

voici l'intégralité du code :

package com.exemple.onglets;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;


public class menu extends Activity {
   /** Called when the activity is first created. */

// pour faciliter la gestion des menus
// nous creons des constantes
private final static int MENU_PARAMETRE = 1;
private final static int MENU_QUITTER = 2;
private final static int SOUSMENU_VIDEO = 1000;
private final static int SOUSMENU_AUDIO = 1001;

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu){
   	//nous créons un premier menu sous forme de sous menu
   	//les sous menu associés à ce menu seront ajoutés à ce sous menu
   	SubMenu sousMenu = menu.addSubMenu(0, MENU_PARAMETRE, Menu.NONE, "Paramètres").setIcon(R.drawable.icon);
   	sousMenu.add(0, SOUSMENU_AUDIO, Menu.NONE, "Audio").setIcon(R.drawable.icon);
   	sousMenu.add(0, SOUSMENU_VIDEO, Menu.NONE, "Video");

   	// il est possible de placer une image dans l'entete du sous menu
   	sousMenu.setHeaderIcon(R.drawable.icon);

   	// nous créons notre deuxieme menu
   	menu.add(0, MENU_QUITTER, Menu.NONE, "Quitter");

   return true;	

   }
   @Override
   public boolean onPrepareOptionsMenu(Menu menu){
   	// nous modifions l'intitulé de notre premier menu
   	// par un intitule différent a chaque clic avec l'heure système
   	menu.getItem(0).setTitle(SystemClock.elapsedRealtime()+"");
   	menu.getItem(0).setIcon(android.R.drawable.ic_secure);
   return super.onPrepareOptionsMenu(menu);	

   }
   @Override
   public boolean onOptionsItemSelected(MenuItem item){
   	switch (item.getItemId()){
   	case MENU_PARAMETRE:
   		Toast.makeText(menu.this, "Ouverture des paramètres",Toast.LENGTH_SHORT).show();

   	case MENU_QUITTER:
   		finish();
   		return true;
   	default:
   		return true;    	
   	}
   }
}

Share this post


Link to post
Share on other sites

A mon avis, c'est ta méthode "OnPrepareOptionMenu" qui pose souci...

Essaye de la mettre entièrement en commentaire et refais le test, pour voir...

Note au passage à quel moment intervient le problème (Démarrage, lors du clic sur le bouton...).

Share this post


Link to post
Share on other sites

non ce n'est pas cela qui pose problème, mêmes erreurs que précédemment.

l'erreur se produit au moment du clic sur menu paramètres

Edited by patk29

Share this post


Link to post
Share on other sites

Alors là, perso, je sèche...

Je vais continuer à chercher de mon coté...

Mais si quelqu'un voit d'où cela pourrait venir, je suis preneur aussi... :)

Share this post


Link to post
Share on other sites

pas de "return" pour "case MENU_PARAMETRE"

normal?

Bien vu Pierre !!!

Manque le "return true;" à la fin du case MENU_PARAMETRE

Share this post


Link to post
Share on other sites

mais je ne pense pas que ça résolve le problème....

tu n'as pas d'autre messages en rouge? (ou d'autres)

peux tu décrire plus précisément les actions que tu fais pour arriver à ce message d'erreur?

Share this post


Link to post
Share on other sites

D'après ce que j'ai compris, il suit les tutos du bouquin "Developper avec Android" de chez Eyrolles.

Il a juste fait le tuto qui concernait les menus et sous menus.

Sont exception pète apparemment au moment où il veut ouvrir le menu (avec le bouton de son tel).

Share this post


Link to post
Share on other sites

si j'ai bien compris le principe du subMenu, il ne devrait pas y avoir de "case MENU_PARAMETRE:" dans "onOptionsItemSelected()"

ou alors ça doit return false...

car le submenu est géré par le système si je comprend bien...

Share this post


Link to post
Share on other sites

Je pense aussi...

Sinon, ouvrir un dialog après un clic sur "Paramètres"...

Mais du coup, on sortirait du sujet, on ne serait plus dans les sous-menus...

Share this post


Link to post
Share on other sites

je ne vois pas la raison pour laquelle on devrait créer un Dialog pour "Paramètres"

C'est au système de s'en occuper.

Il manque aussi un bout de code pour les clic sur les sous menu "audio" et "video"

Share this post


Link to post
Share on other sites

mea culpa !!! effectivement ça marche avec le return du onOptionsitemSelected il était bien dans le bouquin.

bizarre quand meme que ça le gêne pas a la compilation

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.






×
×
  • Create New...