Android: Коли на життєвому циклі діяльності викликається onCreateOptionsMenu?


149

Я поставив пару точок перерви onCreate(одну на початку, а одну в кінці методу), а також поставив одну на початку onCreateOptionsMenu. onCreateМетод викликається першим, і до його завершення onCreateOptionsMenuназивається.

Я намагаюся відокремити Fragmentнавігаційний код у своєму додатку, тому у мене є кілька об'єктів, до яких я делегую onCreateOptionsMenuзалежно від того, чи працює програма на телефоні / планшеті (я використовую розмір екрана, щоб визначити це, мій файл макета для на великих екранах є перегляд, який я перевіряю після того, як макет завищений). Проблема у мене полягає в тому, що я створюю ці об’єкти в onCreate, і я отримую нульове виключення вказівника, коли я посилаюсь на об'єкт onCreateOptionsMenu.

Відповіді:


112

Спочатку onCreate називається спочатку, і перед його завершенням викликається onCreateOptionsMenu.

Це буде правдою для пристроїв та додатків із офіційною панеллю дій у стилі Honeycomb. Якщо немає панелі дій, onCreateOptionsMenu()не слід телефонувати, поки користувач не зателефонує в меню, як правило, натискаючи кнопку MENU.

(Я використовую розмір екрана, щоб визначити це. Мій файл макета для великих екранів має перегляд, який я перевіряю після того, як макет завищений)

Це випробування перерветься дуже скоро, як тільки морозиво бутербродичне. З того, що я можу сказати, телефони ICS матимуть панелі дій (хоча, можливо, не системні смуги).


Я забув згадати, що використовую бібліотеку ActionbarSherlock. Ваша відповідь нагадала мені. Це, мабуть, причина такої поведінки, оскільки це обгортка бібліотеки сумісності, яка розміщує пункти меню у "ActionBar".
Крістофер Перрі

@commonsware - це означає, що на пристроях та додатках, у яких немає панелі дій. Меню з’явиться, навіть якщо у OnCreateOptionsMenu не відображається елемент?
NinjaCoder

12
у моєму випадку onCreateMenu зателефонував після onResume
Костя Хута

1
Так, у мене така ж проблема ... Але мій код пов'язаний з фрагментом.
Йоанна Херкует

У мене почали NPEперевіряти, чи не nav drawer fragmentбуло відкрито onCreateOptionsMenu. Мені довелося ставити нульові перевірки як у onCreateOptionsMenu діяльності, так і у зворотному дзвінку, який використовував фрагмент у своєму onCreateOptionsMenu. Дійсно дивно, бо це відбувалося лише на кількох екранах, але послідовно на тих.
theblang

54

У моєму випадку на Android 2.3 та з FragmentActivityбібліотеки підтримки v4 порядок виклику методів життєвого циклу наступний:

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:

27

Я знайшов, якщо в onResume () дзвоню

invalidateOptionsMenu();

потім onCreateOptionsMenu (меню меню) викликається згодом - відповідно до життєвого циклу діяльності (я думаю, що це правильний термін тут) , як зазначено в @ tir38

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

4
Якщо ви використовуєте дію бароклока, тоді зателефонуйте цьому методуsupportInvalidateOptionsMenu();
Шань Ксееші

3
Будьте обережні, коли говорите "негайно". Це справді не відбудеться відразу. Коли ви invalidateOptionsMenu, завдання для (повторного) створення параметрів, меню буде додано до черги повідомлень інтерфейсу користувача. Що б ще не було в черзі, першим запуститься.
tir38

21

Додаток до відповіді вище, у випадку ICS та стільникового зв’язку onCreateOptionsMenu викликається після onCreate та onPostCreate, тоді як у Gingerbread та більш ранніх версіях він називається після onCreate, але перед onPostCreate. Це єдина різниця, яку я знайшов.


3

За моїм досвідом ActionBarActivityпідтримки v7 onCreateOptionsMenu()закликав setContentView()метод у серединіonCreate() він з'являється на 4.1.1.

Але на 4.4 ще одна історія, яку onCreateOptionMenu()називали після onCreate(). Також я не знаю, що це може бути відразу після, а може, і ні. Але це факт після. Я не тестував інші версії, але 4.1.1 - це перше місце, де у мене виникли проблеми з порядком init.


Можливо, вам потрібно скористатися supportInvalidateOptionsMenu()?
David d C e Freitas

2

Я пропоную створити функцію зворотного виклику у вашому фрагменті, щоб уникнути проблем із тимчасовим терміном з onResume () та onCreateOptionsMenu ().

виконуючи такі роботи бездоганно для мене:

  1. створити та додати фрагмент до своєї діяльності
  2. залиште посилання на цей фрагмент у вашій діяльності
  3. створіть у своєму фрагменті публічний метод doSomethingWithTheMenu ()
  4. викликайте цей метод у межах своєї діяльності, коли викликається onCreateOptionsMenu (меню меню).

приклад:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.