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

时间:2011-10-09 19:20:31

标签: android android-fragments oncreate

我在onCreate中放了几个断点(一个在开头,一个在方法的末尾),我还在onCreateOptionsMenu的开头放了一个断点。首先调用onCreate方法,然后在调用onCreateOptionsMenu之前调用它。

我正在尝试将我的应用中的Fragment导航代码分开,因此根据应用是否在手机/平板电脑上运行,我会将onCreateOptionsMenu委托给几个对象(I我使用屏幕大小来确定这一点,我的大屏幕布局文件在布局膨胀后有一个View I check for)。我遇到的问题是,我在onCreate中创建了这些对象,当我在onCreateOptionsMenu中引用该对象时,我得到一个空指针异常。

6 个答案:

答案 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)

根据ActionBarActivityonCreateOptionsMenu()方法中setContentView()方法调用支持v7 onCreate()的经验onCreateOptionMenu(),它出现在4.1.1。

但是在另一个故事onCreate()上调用了{{1}}。我也不知道它可能是紧接着,也许不是。但事实是事后。我没有测试其他版本,但4.1.1是我第一次遇到init命令的问题。

答案 5 :(得分:2)

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

为我做以下工作完美无缺:

  1. 创建并将您的片段添加到您的活动中
  2. 在您的活动中留下此片段的引用
  3. 在片段中创建一个公共方法doSomethingWithTheMenu()
  4. 在调用onCreateOptionsMenu(菜单菜单)时,在您的活动中调用此方法。
  5. 示例:

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