web-dev-qa-db-fra.com

Android: Quand onCreateOptionsMenu est-il appelé pendant le cycle de vie de l'activité?

J'ai mis quelques points d'arrêt dans onCreate (un au début et un à la fin de la méthode), et j'en ai aussi placé un au début de onCreateOptionsMenu. La méthode onCreate est appelée en premier et avant qu'elle ne soit terminée, onCreateOptionsMenu est appelée.

J'essaie de séparer le code de navigation Fragment dans mon application. Je délègue donc quelques objets à onCreateOptionsMenu selon que l'application fonctionne sur le téléphone/la tablette ( m en utilisant la taille de l’écran pour le déterminer, mon fichier de présentation pour les grands écrans a une vue que je vérifie une fois la présentation gonflée). Le problème que je rencontre est que je crée ces objets dans onCreate et que je reçois une exception de pointeur nul lorsque je fais référence à l'objet dans onCreateOptionsMenu.

141

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

Cela sera vrai sur les appareils et les applications dotés d'une barre d'action officielle de style Honeycomb. S'il n'y a pas de barre d'action, onCreateOptionsMenu() ne doit pas être appelé avant que l'utilisateur appelle le menu, généralement en appuyant sur la touche MENU.

(J'utilise la taille de l'écran pour le déterminer, mon fichier de présentation pour les grands écrans a une vue que je vérifie une fois la présentation gonflée.)

Ce test sera brisé très bientôt, une fois que le sandwich à la crème glacée sera expédié. D'après ce que je peux dire, ICS auront des barres d'action (bien que peut-être pas des barres système).

105
CommonsWare

Dans mon cas sur Android 2.3 et avec FragmentActivity à partir de la bibliothèque v4-support, 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:
51
Lemberg

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

invalidateOptionsMenu();

puis onCreateOptionsMenu (menu) s’appelle ensuite - selon le cycle de vie de l’activité (je pense que c’est le bon terme ici) , comme indiqué par @ tir38

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}
25
Gene Bo

Ajout dans la réponse ci-dessus, dans le cas où ICS et Honeycomb onCreateOptionsMenu est appelé après onCreate et onPostCreate, tandis que dans Gingerbread et dans les versions antérieures, il est appelé après onCreate mais avant onPostCreate. C'est la seule différence que j'ai trouvée.

21
Pawan Maheshwari

Dans mon expérience, ActionBarActivity du support v7 onCreateOptionsMenu() appelé dans la méthode setContentView() au milieu de la fonction onCreate(), il apparaît sous 4.1.1.

Mais sur 4.4 une autre histoire onCreateOptionMenu() appelée après onCreate(). De plus, je ne sais pas si cela peut être juste après, peut-être pas. Mais c'est un fait après. Je n'ai pas testé sur d'autres versions mais 4.1.1 est la première où j'ai eu un problème avec init order.

3
Yevgen Kulik

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

faire les travaux suivants sans faille pour moi:

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

exemple:

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