Android: когда вызывается onCreateOptionsMenu в течение жизненного цикла Activity? - PullRequest
141 голосов
/ 09 октября 2011

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

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

Ответы [ 6 ]

104 голосов
/ 10 октября 2011

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

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

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

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

50 голосов
/ 18 июля 2013

В моем случае на 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:
24 голосов
/ 25 марта 2014

Я обнаружил, что если в onResume () я вызываю

invalidateOptionsMenu();

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

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}
21 голосов
/ 11 мая 2012

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

3 голосов
/ 22 апреля 2014

По моему опыту ActionBarActivity из техподдержки v7 onCreateOptionsMenu() вызвал setContentView() метод в середине onCreate() он появляется на 4.1.1.

Но на 4.4 другая история onCreateOptionMenu() называется после onCreate(). Кроме того, я не знаю, это может быть сразу после, а может и нет. Но это факт после. Я не тестировал другие версии, но 4.1.1 - первая, где у меня были проблемы с порядком инициализации.

2 голосов
/ 01 октября 2014

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

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

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

пример:

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