154

我放了几个断点onCreate(一个在开头,一个在方法结尾),我还在onCreateOptionsMenu. 该onCreate方法首先被调用,在它完成之前onCreateOptionsMenu被调用。

我试图Fragment在我的应用程序中分离导航代码,所以我有几个对象我委托onCreateOptionsMenu给取决于应用程序是否在手机/平板电脑上运行(我使用屏幕大小来确定这一点,我的布局文件大屏幕有一个我在布局膨胀后检查的视图)。我遇到的问题是,我在 onCreate 中创建了这些对象,当我在onCreateOptionsMenu.

4

6 回答 6

113

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

在具有官方 Honeycomb 样式操作栏的设备和应用程序上,这将是正确的。如果没有操作栏,onCreateOptionsMenu()则在用户调用菜单之前不应调用,通常通过按下 MENU 按钮。

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

一旦冰淇淋三明治发货,该测试将很快打破。据我所知,ICS 手机会有操作栏(虽然可能没有系统栏)。

于 2011-10-09T21:15:22.930 回答
58

在我的 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:
于 2013-07-18T15:33:31.633 回答
29

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

invalidateOptionsMenu();

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

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}
于 2014-03-25T03:36:56.467 回答
21

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

于 2012-05-11T07:53:21.963 回答
3

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

但是在 4.4onCreateOptionMenu()之后又发生了另一个故事onCreate()。我也不知道它可能是紧随其后,也许不是。但是是事实之后。我没有在其他版本上进行测试,但 4.1.1 是我在 init 顺序上遇到问题的第一个版本。

于 2014-04-21T20:30:34.917 回答
2

i suggest to create a callback-function in your fragment to avoid timing issues with onResume() and onCreateOptionsMenu().

doing the following works flawless for me:

  1. create and add your fragment to your activity
  2. leave a reference of this fragment in your activity
  3. create a public method doSomethingWithTheMenu() in your fragment
  4. call this method from within your activity when onCreateOptionsMenu(Menu menu) is called.

example:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
于 2014-10-01T19:25:27.620 回答