【问题标题】:Android: When is onCreateOptionsMenu called during Activity lifecycle?Android:在 Activity 生命周期中何时调用 onCreateOptionsMenu?
【发布时间】:2011-12-04 02:10:36
【问题描述】:

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

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

【问题讨论】:

    标签: android android-fragments oncreate


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我忘了提到我正在使用 ActionbarSherlock 库。你的回答提醒了我。这可能是这种行为的原因,因为它是兼容性库的包装器,它将菜单项放在“ActionBar”中。
    • @commonsware - 这意味着在没有操作栏的设备和应用程序上。即使 onCreateOptionsMenu 没有项目可见,菜单也会显示?
    • 在我的情况下 onCreateMenu 在 onResume 之后调用
    • 是的,我也有同样的问题...但是我的代码与片段有关。
    • 在检查nav drawer fragment 是否在onCreateOptionsMenu 中打开时,我开始使用NPE。我必须在活动的 onCreateOptionsMenu 以及片段在其 onCreateOptionsMenu 中使用的回调中都进行空检查。真的很奇怪,因为它只发生在几个屏幕上,但一直在那些屏幕上发生。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我发现如果我在 onResume() 中调用了

      invalidateOptionsMenu();
      

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

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

      【讨论】:

      • 如果你使用 actionbarsherlock 然后调用这个方法supportInvalidateOptionsMenu();
      • 当你说“立即”时要小心。它不会真正立即发生。当您invalidateOptionsMenu 时,(重新)创建选项菜单的作业将被添加到 UI 的消息队列中。队列中的其他内容将首先运行。
      • 它不是完美的解决方案,因为在onResume 中添加invalidateOptionsMenu 后我仍然收到空点异常错误。
      • @Pooja 你可以考虑用最少的代码发布一个问题来重现错误
      • @GeneBo 我正在尝试访问onCreate 中的mOptionsMenu.findItem(R.id.menu_favorite).setIcon(R.drawable.ic_heart_filled);,但它给出了空指针异常,即使我将invalidateOptionsMenu 放入onResume
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 或许你需要使用supportInvalidateOptionsMenu()
        【解决方案6】:

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

        执行以下操作对我来说完美无缺:

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

        示例:

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

        【讨论】:

          猜你喜欢
          • 2023-03-14
          • 2013-04-06
          • 2013-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-02
          • 1970-01-01
          • 2015-05-13
          相关资源
          最近更新 更多