Android: 在活动生命周期中 onCreateOptionsMenu 何时被调用?

我在 onCreate中放置了两个断点(一个在方法的开头,一个在方法的结尾) ,我还在 onCreateOptionsMenu的开头放置了一个断点。首先调用 onCreate方法,在完成之前调用 onCreateOptionsMenu

我试图分离我的应用程序中的 Fragment导航代码,所以我有一对夫妇的对象,我委托 onCreateOptionsMenu取决于如果应用程序是在手机/平板电脑上运行(我使用屏幕大小来确定这一点,我的布局文件为大屏幕有一个视图,我检查后,布局充气)。我遇到的问题是,我在 onCreate 中创建了这些对象,当我在 onCreateOptionsMenu中引用这个对象时,我得到了一个空指针异常。

81227 次浏览

首先调用 onCreate 方法,在完成之前调用 onCreateOptionsMenu。

对于那些拥有官方蜂巢式操作栏的设备和应用程序来说,情况确实如此。如果没有操作栏,则在用户调用菜单(通常是通过按 MENU 按钮)之前,不应调用 onCreateOptionsMenu()

(我使用屏幕尺寸来确定这一点,我的大屏幕布局文件有一个视图,我检查布局充气后)

一旦冰淇淋三明治上船,测试很快就会结束。据我所知,ICS 手机将有动作条(尽管可能不是系统条)。

另外,在上面的回答中, 对于 ICS 和 Honeycomb onCreateOptionsMenu 在 onCreate 和 onPostCreate 之后调用,而在 Gingerbread 和早期版本中,它在 onCreate 之后但在 onPostCreate 之前调用。这是我发现的唯一区别。

在我的 Android 2.3和 v4-support 库中的 FragmentActivity中,调用生命周期方法的顺序如下:

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:

我发现如果在简历()我打电话

invalidateOptionsMenu();

然后调用 onCreateOptionsMenu (Menu Menu)-根据 活动生命周期活动生命周期 (我认为这是正确的术语),如@tir38所示

@Override
public void onResume() {
super.onResume();
invalidateOptionsMenu();
}

根据我的经验,在 onCreate()中间的 setContentView()方法中从支持 v7 onCreateOptionsMenu()调用的 ActionBarActivity出现在4.1.1。

但是在4.4节目中,另一个故事 onCreateOptionMenu()onCreate()之后呼叫。我也不知道会不会马上发生,也许不会。但这是事实。我没有在其他版本上测试,但是4.1.1是第一个初始顺序有问题的版本。

我建议在片段中创建一个回调函数,以避免 onResume ()和 onCreateOptionsMenu ()的计时问题。

为我完美地完成以下工作:

  1. 创建片段并将其添加到活动中
  2. 在你的活动中留下这个片段的参考
  3. 在片段中创建一个公共方法 doSomething WithTheMenu ()
  4. 当调用 onCreateOptionsMenu (Menu 菜单)时,从活动中调用此方法。

例如:

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