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


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

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

6 129

6 ответов:

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

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

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

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

в моем случае на Android 2.3 и с FragmentActivity из библиотеки V4-support порядок вызова методов жизненного цикла следующий:

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:

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

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

invalidateOptionsMenu();

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

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

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

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

пример:

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

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

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