Android: kiedy jest oncreateoptionsmenu wywoływany podczas cyklu życia aktywności?

Umieszczam kilka punktów przerwania w onCreate (jeden na początku i jeden na końcu metody), a także jeden na początku onCreateOptionsMenu. Metoda onCreate jest wywoływana jako pierwsza, a przed jej zakończeniem wywoływana jest onCreateOptionsMenu.

Próbuję oddzielić kod nawigacji Fragment w mojej aplikacji, więc mam kilka obiektów, które deleguję onCreateOptionsMenu w zależności od tego, czy aplikacja działa na telefonie/tablecie (używam rozmiaru ekranu, aby to określić, mój plik układu dla dużych ekranów ma widok, który sprawdzam po nadmuchaniu układu). Problem polega na tym, że tworzę te obiekty w onCreate i otrzymuję wyjątek wskaźnika null, gdy odwołuję się do obiektu w onCreateOptionsMenu.

Author: galvan, 2011-10-09

6 answers

Metoda onCreate jest wywoływany pierwszy, i zanim zakończy onCreateOptionsMenu jest wywoływany.

Będzie to prawdą na urządzeniach i aplikacjach z oficjalnym paskiem akcji w stylu Plastra Miodu. Jeśli nie ma paska akcji, onCreateOptionsMenu() nie powinno być wywoływane, dopóki użytkownik nie wywoła menu, zazwyczaj naciskając przycisk MENU.

(używam rozmiaru ekranu, aby to określić, mój plik układu dla dużych ekranów ma widok, który sprawdzam po tym, jak układ jest napompowane)

Ten test zostanie przerwany bardzo szybko, gdy Ice Cream Sandwich statki. Z tego co wiem, telefony ICS będą miały paski akcji (choć może nie Paski systemowe).

 98
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 21:15:22

W moim przypadku na Androidzie 2.3 i z {[1] } z biblioteki V4-support kolejność wywoływania metod cyklu życia jest następująca:

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:
 45
Author: Lemberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-18 15:33:31

Dodanie w powyższej odpowiedzi, W przypadku ICS i Honeycomb oncreateoptionsmenu nazywa się after OnCreate i onPostCreate, podczas gdy w piernikach i wcześniejszych wersjach nazywa się after OnCreate, ale przed onPostCreate. To jedyna różnica, jaką znalazłem.

 21
Author: Pawan Maheshwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-11 08:22:36

I found if in onResume () I call

invalidateOptionsMenu();

Następnie oncreateoptionsmenu (menu menu) jest wywoływany później-zgodnie z cyklem życia aktywności (myślę, że to poprawne określenie tutaj) , jak wskazał @tir38

 21
Author: gnB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 19:23:32

Proponuję utworzyć funkcję zwrotną w swoim fragmencie, aby uniknąć problemów z czasem onResume() i onCreateOptionsMenu ().

Wykonuję dla mnie następujące prace:

  1. Utwórz i dodaj swój fragment do swojej aktywności
  2. zostaw odniesienie do tego fragmentu w swojej aktywności
  3. Utwórz publiczną metodę doSomethingWithTheMenu () w swoim fragmencie
  4. wywołaj tę metodę z poziomu swojej aktywności, gdy onCreateOptionsMenu (menu) jest dzwoniłem.

Przykład:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
 2
Author: datayeah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-01 19:25:27

Z mojego doświadczenia ActionBarActivity Z support v7 onCreateOptionsMenu() wywołana w setContentView() Metoda w środku onCreate() pojawia się na 4.1.1.

Ale na 4.4 inna historia onCreateOptionMenu() nazwana po onCreate(). Nie wiem też, czy to może być natychmiast po, może nie. Ale to fakt po. Nie testowałem na innych wersjach, ale 4.1.1 jest pierwszym, gdzie miałem problem z kolejnością init.

 1
Author: Yevgen Kulik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-18 14:15:17