6

出于某种原因,在我的应用程序中onCreateOptionsMenu()被调用onResume()...因此,我在设置 UI 时无法控制菜单(介于onCreate()和之间onResume()),这导致无法设置相应的操作我的 ActionBar 的项目...

到目前为止,我发现的唯一解决方法是在返回invalidateOptionsMenu()之前手动调用onCreate();这种方式onCreateOptionsMenu()会立即被调用,我抓住菜单,然后我终于可以添加所需的操作项。

有没有人遇到过这个问题?你应该如何以编程方式设置你给定的操作项onCreateOptionsMenu()被调用后onResume()

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

4

1 回答 1

6

首先考虑也许你不应该这样做。听起来您的想法可能与 Android 的典型设计模式背道而驰。例如,如果您的菜单响应用户选择而改变,您应该使用上下文操作模式。

  • 来自操作栏 API 指南

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

  • 菜单 API 指南

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


除此之外,如果您确实想按照您所描述的那样更改菜单项,您应该onPrepareOptionsMenu(). 当发生需要更改菜单项的事件时,将相关信息放入字段并调用invalidateOptionsMenu(). 覆盖onPrepareOptionsMenu()并检查字段的值以确定要添加/删除的菜单项。

(它也可以调用invalidateOptionsMenu()和覆盖onCreateOptionsMenu()来修改应该显示的菜单项,尽管不推荐这种方法。)

更多来自菜单 API 指南

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

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

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

  • 在 Android 3.0 及更高版本上,当菜单项出现在操作栏中时,选项菜单被认为始终处于打开状态。当事件发生并且您想要执行菜单更新时,您必须调用 invalidateOptionsMenu()系统调用来请求 onPrepareOptionsMenu()

于 2012-09-21T13:51:09.920 回答