我在onCreate
中放了几个断点(一个在开头,一个在方法的末尾),我还在onCreateOptionsMenu
的开头放了一个断点。首先调用onCreate
方法,然后在调用onCreateOptionsMenu
之前调用它。
我正在尝试将我的应用中的Fragment
导航代码分开,因此根据应用是否在手机/平板电脑上运行,我会将onCreateOptionsMenu
委托给几个对象(I我使用屏幕大小来确定这一点,我的大屏幕布局文件在布局膨胀后有一个View I check for)。我遇到的问题是,我在onCreate中创建了这些对象,当我在onCreateOptionsMenu
中引用该对象时,我得到一个空指针异常。
答案 0 :(得分:103)
首先调用onCreate方法,然后在调用onCreateOptionsMenu之前调用它。
在具有官方Honeycomb风格的操作栏的设备和应用程序中也是如此。如果没有操作栏,则在用户调出菜单之前不应调用onCreateOptionsMenu()
,通常是按MENU按钮。
(我正在使用屏幕大小来确定这一点,我的大屏幕布局文件有一个View I在布局膨胀后检查)
一旦Ice Cream Sandwich发货,该测试将很快破裂。据我所知,ICS手机将有动作栏(虽然可能不是系统栏)。
答案 1 :(得分:50)
在我的案例中,在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:
答案 2 :(得分:24)
我发现如果在onResume()中我调用
invalidateOptionsMenu();
然后onCreateOptionsMenu(菜单菜单)随后被调用 - 根据活动生命周期 (我认为这里是正确的术语),如下所示@ tir38
@Override
public void onResume() {
super.onResume();
invalidateOptionsMenu();
}
答案 3 :(得分:21)
在上面的答案中加入, 如果ICS和Honeycomb onCreateOptionsMenu在onCreate和onPostCreate之后调用,而在Gingerbread和早期版本中,它在onCreate之后但在onPostCreate之前调用。这是我找到的唯一区别。
答案 4 :(得分:3)
根据ActionBarActivity
中onCreateOptionsMenu()
方法中setContentView()
方法调用支持v7 onCreate()
的经验onCreateOptionMenu()
,它出现在4.1.1。
但是在另一个故事onCreate()
上调用了{{1}}。我也不知道它可能是紧接着,也许不是。但事实是事后。我没有测试其他版本,但4.1.1是我第一次遇到init命令的问题。
答案 5 :(得分:2)
我建议在你的片段中创建一个回调函数,以避免onResume()和onCreateOptionsMenu()的时序问题。
为我做以下工作完美无缺:
示例:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (this.myFragment != null) {
this.myFragment.doSomethingWithTheMenu(menu);
}
return true;
}