如何在UI设置时获取ActionBar菜单?

时间:2012-09-20 21:04:27

标签: android android-actionbar

出于某种原因,onCreateOptionsMenu()在我的应用中被称为onResume() ...因此,我在设置用户界面时无法抓住菜单(在{之间) {1}}和onCreate()),导致无法为我的ActionBar设置相应的操作项...

到目前为止,我发现的唯一解决方法是在onResume()返回之前手动调用invalidateOptionsMenu();那样方式onCreate()立即被调用,我得到一个菜单,然后我最终可以添加所需的操作项。

有没有人遇到过这个问题?在onCreateOptionsMenu()之后调用onCreateOptionsMenu()时,您应该如何以编程方式设置自己的操作项?

我的应用程序在JellyBean上运行,它使用内置的ActionBar(没有ActionBarSherlock),onResume()android:minSdkVersion="14"

1 个答案:

答案 0 :(得分:6)

首先考虑一下,也许你不应该这样做。听起来您的想法可能违反Android的典型设计模式。例如,如果您的菜单正在响应用户选择而发生变化,则应使用上下文操作模式。

  • 来自Action Bar API Guide

      

    作为一般规则,选项菜单中的所有项目(更不用说操作项)应该对应用程序产生全局影响,而不是仅影响界面的一小部分。 [...]因此,即使在决定菜单项是否应显示为操作项之前,请确保该项具有当前活动的全局范围。

  • 来自Menu API Guide

      

    您永远不应该根据当前关注的View更改选项菜单中的项目。在触摸模式下(当用户不使用轨迹球或d-pad时),视图无法获得焦点,因此您不应将焦点作为修改选项菜单中项目的基础。如果您想提供对View上下文相关的菜单项,请使用Context Menu


除非您确实想要更改菜单项,否则您应该onPrepareOptionsMenu() 中进行更改。当发生需要更改菜单项的事件时,将相关信息放入字段并调用invalidateOptionsMenu()。覆盖onPrepareOptionsMenu()并检查字段的值以确定要添加/删除的菜单项。

(也可以调用invalidateOptionsMenu()并覆盖onCreateOptionsMenu()来修改应显示哪些菜单项,但不推荐这种方法。)

来自Menu API Guide的更多内容:

  

您应该仅使用onCreateOptionsMenu()来创建初始值   菜单状态,不在活动生命周期中进行更改。   如果要根据发生的事件修改选项菜单   在活动生命周期中,你可以这样做   onPrepareOptionsMenu()方法。

     

此方法会将您当前存在的Menu对象传递给您   可以修改它,例如添加,删除或禁用项目。 (碎片也   提供onPrepareOptionsMenu()回调。)

     
      
  • 在Android 2.3.x及更低版本中,系统调用onPrepareOptionsMenu()   每次用户打开选项菜单(按菜单按钮)。

  •   
  • 在Android 3.0及更高版本中,选项菜单始终被视为   菜单项在操作栏中显示时打开。当一个事件   发生并且您想要执行菜单更新,您必须调用   invalidateOptionsMenu()请求系统调用   onPrepareOptionsMenu()

  •