繁体   English   中英

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

[英]Android: When is onCreateOptionsMenu called during Activity lifecycle?

我把一对夫妇断点onCreate (一个开头,一个在方法结束),我也把一个之初onCreateOptionsMenu 首先调用onCreate方法,然后在调用onCreateOptionsMenu之前调用它。

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

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

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

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

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

在我的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:

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

invalidateOptionsMenu();

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

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}

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

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

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

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

做以下工作对我来说完美无缺:

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

例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM