Android: Когда вызывается onCreateOptionsMenu во время жизненного цикла Activity?

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

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

Ответ 1

Сначала вызывается метод onCreate и перед его завершением вызывается onCreateOptionsMenu.

Это будет верно на устройствах и приложениях с официальной панелью действий сотовой панели. Если нет панели действий, onCreateOptionsMenu() не следует вызывать до тех пор, пока пользователь не вызовет меню, как правило, нажав кнопку MENU.

(Я использую размер экрана, чтобы определить это, мой файл макета для больших экранов имеет проверку вида я после того, как макет завышен)

Этот тест прорвется очень скоро, как только Ice Cream Sandwich отправится. Из того, что я могу сказать, телефоны ICS будут иметь панели действий (хотя, возможно, не системные панели).

Ответ 2

В моем случае на 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:

Ответ 3

Добавление в вышеприведенном ответе, В случае ICS и Honeycomb onCreateOptionsMenu вызывается после onCreate и onPostCreate, а в Gingerbread и более ранних версиях он вызывается после onCreate, но до onPostCreate. Это единственное различие, которое я нашел.

Ответ 4

Я нашел, если в onResume() я вызываю

invalidateOptionsMenu();

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

Ответ 5

Я предлагаю создать функцию обратного вызова в вашем фрагменте, чтобы избежать проблем с синхронизацией с onResume() и onCreateOptionsMenu().

делает следующие работы безупречными для меня:

  • создайте и добавьте фрагмент в свою активность.
  • оставьте ссылку на этот фрагмент в своей деятельности
  • создать общедоступный метод doSomethingWithTheMenu() в вашем фрагменте
  • вызов этого метода из вашей активности, когда вызывается onCreateOptionsMenu (меню меню).

Пример:

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

Ответ 6

В моем опыте ActionBarActivity из поддержки v7 onCreateOptionsMenu вызывается в setContentView(); метод. в середине onCreate() он появляется на 4.1.1. Но на 4.4 еще одна история onCreateOptionMenu вызывается после onCreate(). Также я не знаю, что это может произойти сразу после этого, может быть, нет. Но это факт. Я не тестировал другие версии, но 4.1.1 является первым, когда у меня были проблемы с порядком init.