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

6
由于某种原因,在我的应用程序中,onCreateOptionsMenu()onResume()之后被调用...因此,在我设置UI时(在onCreate()onResume()之间),我不能获得菜单,这导致无法为我的ActionBar设置相应的操作项...目前我找到的唯一解决方法是在onCreate()返回之前手动调用invalidateOptionsMenu()函数。这样onCreateOptionsMenu()会立即被调用,我就可以获得菜单,然后最终添加所需的操作项了。 有人遇到这个问题吗?如何在onCreateOptionsMenu()onResume()之后被调用的情况下编程设置操作项呢? 我的应用程序运行在JellyBean上,使用内置的ActionBar(没有ActionBarSherlock),android:minSdkVersion="14"android:targetSdkVersion="16"

快速检查一下,你说的是activity的onCreate和onResume方法,对吗?而不是Fragment中对应的方法。 - Alexander Lucas
为什么不能在onCreateOptionsMenu()中设置菜单项(而不是仅将其用于存储菜单的引用以供以后使用)? - quietmint
1
我和user113215一样,为什么你需要在onResume()中了解菜单呢?这似乎不太对。 - dmon
@AlexanderLucas:是的,我在谈论Activity的onCreate和onResume方法。 - Andrés Pachon
@AlexanderLucas 和 user113215:我需要根据用户生成的事件动态添加/删除操作项;当然,这些事件可能会在执行onCreateOptionsMenu()之后很长时间才发生...这就是为什么我需要获取菜单的原因。 - Andrés Pachon
当用户执行需要更新菜单的操作时,请调用 invalidateOptionsMenu(),就像用户*所说的那样。 - dmon
1个回答

6

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

  • 来自操作栏API指南

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

  • 来自菜单API指南

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


除此之外,如果您确实想要像您所描述的那样更改菜单项,您应该在onPrepareOptionsMenu()中进行更改。当需要更改菜单项的事件发生时,将相关信息放入字段并调用invalidateOptionsMenu()。覆盖onPrepareOptionsMenu()并检查字段的值以确定添加/删除哪些菜单项。
(调用invalidateOptionsMenu()并覆盖onCreateOptionsMenu()以修改应显示哪些菜单项也可以工作,但不建议采用这种方法。)
来自Menu API Guide的更多信息:
您应该仅使用onCreateOptionsMenu()来创建初始菜单状态,而不是在活动生命周期期间进行更改。如果您想根据活动生命周期中发生的事件修改选项菜单,则可以在onPrepareOptionsMenu()方法中执行此操作。
此方法将当前的Menu对象传递给您,以便您可以修改它,例如添加、删除或禁用项目。(片段还提供了一个onPrepareOptionsMenu()回调。)
在Android 2.3.x及以下版本中,系统每次用户打开选项菜单(按下菜单按钮)时都会调用onPrepareOptionsMenu()
在Android 3.0及更高版本中,当在操作栏中呈现菜单项时,选项菜单被认为始终处于打开状态。当发生事件并且您想执行菜单更新时,您必须调用invalidateOptionsMenu()请求系统调用onPrepareOptionsMenu()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接