153 votes

Android : Lorsque onCreateOptionsMenu est appelé au cours de l’activité du cycle de vie ?

J'ai mis un couple de points d'arrêt en onCreate (une au début et une à la fin de la méthode), et j'ai aussi mis une au début de l' onCreateOptionsMenu. L' onCreate méthode est appelée en premier lieu, et avant la fin de la onCreateOptionsMenu est appelé.

Je suis en train de séparer l' Fragment code de navigation dans mon application, j'ai donc quelques objets que j'délégué onCreateOptionsMenu selon si l'application est en cours d'exécution sur le téléphone ou la tablette (je suis en utilisant la taille de l'écran pour déterminer cela, mon fichier de mise en page pour les grands écrans a un point de Vue je vérifier après la mise en page est gonflé). Le problème que je vais avoir est, j'ai créer ces objets dans onCreate, et je me fais une exception de pointeur null lorsque j'référence de l'objet en onCreateOptionsMenu.

113voto

CommonsWare Points 402670

La méthode onCreate est appelé en premier, et avant la fin de la onCreateOptionsMenu est appelé.

Ce sera le cas sur les appareils et les applications avec un Nid d'abeille-le style de la barre d'action. Si il n'y a pas de barre d'action, onCreateOptionsMenu() ne devrait pas être appelé jusqu'à ce que l'utilisateur appelle le menu, généralement en appuyant sur le bouton MENU.

(Je suis en utilisant la taille de l'écran pour déterminer cela, mon fichier de mise en page pour les grands écrans a un point de Vue je vérifier après la mise en page est gonflé)

Ce test va casser très peu de temps, une fois le Sandwich à la Crème Glacée navires. À partir de ce que je peux dire, ICS téléphones auront barres d'action (mais peut-être pas de système de barres).

58voto

Lemberg Points 829

Dans mon cas sous Android 2.3 et avec FragmentActivity de la bibliothèque de support v4, l'ordre des méthodes de cycle de vie invoqué est le suivant:

 07-18 18:29:21.629  20183-20183/? I/onCreate:
07-18 18:29:21.719  20183-20183/? I/onStart: 
07-18 18:29:21.719  20183-20183/? I/onResume: 
07-18 18:29:21.739  20183-20183/? I/onCreateOptionsMenu:
 

29voto

gnB Points 760

J'ai trouvé si dans onResume () j'appelle

 invalidateOptionsMenu();
 

alors onCreateOptionsMenu (menu Menu) est appelé immédiatement après

21voto

Pawan M Points 4396

Plus dans ci-dessus la réponse, en cas d’onCreateOptionsMenu ICS et nid d’abeille est appelée après onCreate et onPostCreate, tandis que dans le pain d’épice et les versions antérieures, il est appelé après onCreate mais avant onPostCreate. C’est la seule différence que j’ai trouvé.

2voto

datayeah Points 433

je suggère de créer un rappel fonction de votre fragment d'éviter les problèmes de synchronisation avec onResume() et onCreateOptionsMenu().

procédant de la manière suivante fonctionne impeccable pour moi:

  1. créer et ajouter votre fragment de votre activité
  2. laisser une référence de ce fragment dans votre activité
  3. créer une méthode publique doSomethingWithTheMenu() dans votre fragment
  4. appeler cette méthode à partir de votre activité lors de la onCreateOptionsMenu(Menu menu) est appelée.

exemple:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X