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

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

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

6 ответов

Решение

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

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

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

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

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

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

invalidateOptionsMenu();

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

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

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

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

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

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

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

пример:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
Другие вопросы по тегам