Android:在Activity生命周期中何时调用onCreateOptionsMenu?

我在onCreate (一个开始,一个在方法结尾)放了几个断点,并且在onCreate的开头也放了一个断点。 首先调用onCreate方法,并在完成之前调用onCreateOptionsMenu

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

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

对于具有官方Honeycomb风格的操作栏的设备和应用程序,情况将会如此。 如果没有操作栏, onCreateOptionsMenu()不应该被调用,直到用户调用菜单,通常通过按MENUbutton。

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

一旦冰淇淋三明治运送,那testing将很快打破。 从我可以告诉,ICS电话将有行动酒吧(但也许不系统酒吧)。

在我的情况下在Android 2.3和从V4支持库的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: 

除了上面的回答,在ICS和Honeycomb的情况下,onCreateOptionsMenu在onCreate和onPostCreate之后调用,而在Gingerbread和早期版本中调用onCreate之后而onPostCreate之前。 这是我发现的唯一区别。

我发现如果在onResume()我打电话

 invalidateOptionsMenu(); 

然后onCreateOptionsMenu(菜单菜单)之后被调用 – 根据活动生命周期 (我认为这是正确的术语) ,如@ tir38

我build议在你的片段中创build一个callback函数来避免onResume()和onCreateOptionsMenu()的计时问题。

做以下作品对我来说是完美无缺的:

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

例:

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

根据我的经验,支持v7的ActionBarActivity onCreateOptionsMenu在setContentView()中调用; 方法。 在onCreate()中间出现在4.1.1上。 但是在onCreate()之后的另一个故事onCreateOptionMenu上调用了4.4。 我也不知道可能会马上过来,可能不会。 但事实上是事后。 我没有在其他版本上testing,但4.1.1是第一次,我有一个init命令的麻烦。