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().
выполнение следующих работ для меня безупречно:
- создать и добавить свой фрагмент в вашу деятельность
- оставить ссылку на этот фрагмент в вашей деятельности
- создайте публичный метод doSomethingWithTheMenu() в вашем фрагменте
- вызывайте этот метод из своей деятельности, когда вызывается onCreateOptionsMenu (меню меню).
пример:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (this.myFragment != null) {
this.myFragment.doSomethingWithTheMenu(menu);
}
return true;
}