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

Chr*_*rry 144 android oncreate android-fragments

我放了几个断点onCreate(一个在开头,一个在方法结束时),我也在一个开头放了一个断点onCreateOptionsMenu.onCreate首先调用该方法,并在onCreateOptionsMenu调用之前调用该方法.

我正试图Fragment在我的应用程序中分离导航代码,所以我onCreateOptionsMenu根据应用程序是否在手机/平板电脑上运行来分配给我的几个对象(我使用屏幕大小来确定这个,我的布局文件是大屏幕有一个View I在布局膨胀后检查).我遇到的问题是,我在onCreate中创建了这些对象,当我引用该对象时,我得到一个空指针异常onCreateOptionsMenu.

Com*_*are 108

首先调用onCreate方法,然后在调用onCreateOptionsMenu之前调用它.

在具有官方Honeycomb风格的操作栏的设备和应用程序中也是如此.如果没有操作栏,onCreateOptionsMenu()则在用户调出菜单之前不应该调用,通常是按MENU按钮.

(我使用屏幕大小来确定这一点,我的大屏幕布局文件有一个View I在布局膨胀后检查)

一旦冰淇淋三明治发货,该测试将很快破裂.据我所知,ICS手机将有动作栏(虽然可能不是系统栏).

  • 在我的情况下onCreateMenu调用onResume之后 (10认同)

Rom*_*ych 54

就我的Android 2.3和FragmentActivityv4-support库而言,生命周期方法调用的顺序如下:

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:
Run Code Online (Sandbox Code Playgroud)


Gen*_* Bo 25

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

invalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)

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

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你正在使用actionbarsherlock,那么调用这个方法`supportInvalidateOptionsMenu();` (4认同)
  • 当你说"马上"时要小心.它不会立即真正发生.当你"invalidateOptionsMenu"时,(重新)创建选项菜单的作业将被添加到UI的消息队列中.队列中的其他任何内容都将首先运行. (3认同)

Paw*_*ari 21

在上面的答案中添加,在ICS和Honeycomb onCreateOptionsMenu的情况下,在onCreate和onPostCreate之后调用,而在Gingerbread和早期版本中,它在onCreate之后但在onPostCreate之前调用.这是我发现的唯一区别.