出于某种原因,onCreateOptionsMenu()
在我的应用中被称为onResume()
...因此,我在设置用户界面时无法抓住菜单(在{之间) {1}}和onCreate()
),导致无法为我的ActionBar设置相应的操作项...
到目前为止,我发现的唯一解决方法是在onResume()
返回之前手动调用invalidateOptionsMenu()
;那样方式onCreate()
立即被调用,我得到一个菜单,然后我最终可以添加所需的操作项。
有没有人遇到过这个问题?在onCreateOptionsMenu()
之后调用onCreateOptionsMenu()
时,您应该如何以编程方式设置自己的操作项?
我的应用程序在JellyBean上运行,它使用内置的ActionBar(没有ActionBarSherlock),onResume()
和android:minSdkVersion="14"
答案 0 :(得分:6)
首先考虑一下,也许你不应该这样做。听起来您的想法可能违反Android的典型设计模式。例如,如果您的菜单正在响应用户选择而发生变化,则应使用上下文操作模式。
作为一般规则,选项菜单中的所有项目(更不用说操作项)应该对应用程序产生全局影响,而不是仅影响界面的一小部分。 [...]因此,即使在决定菜单项是否应显示为操作项之前,请确保该项具有当前活动的全局范围。
您永远不应该根据当前关注的
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()
。