在Android 3.0及以上版本中使用`onPrepareOptionsMenu()`的方法

21
我很好奇在 Android 3.0+ 并针对 API 11 或更高版本时,是否会使用 onPrepareOptionsMenu(Menu)(以及由此延伸的onPreparePanel(int, View, Menu))。
我的想法如下:
一个ActivityActionBaronCreateOptionsMenu(Menu)获取其内容,您可以填充XML菜单资源、直接添加选项,或两者兼而有之。该活动的任何片段也会收到此调用,并可以选择执行相同的操作。
要更新ActionBar上的项目,您可以保留Menu实例或调用invalidateOptionsMenu(),这将导致再次调用onCreateOptionsMenu(Menu)
因此,onPrepareOptionsMenu(Menu)是否仅存在以支持不针对API 11或更高版本的旧应用程序?
调用getActionBar().hide()getActionBar().show()是否可能会触发对onPrepareOptionsMenu(Menu)的调用?
添加或删除片段是否以某种方式触发这一过程?
2个回答

10

经过我的广泛测试,奇怪的是它似乎与平台的3.0版本之前完全一样,只在打开溢出菜单时才被调用。回调函数在原问题中列出的两个事件都没有触发。

一个可能显而易见但值得注意的事实是:整个菜单都可以在这个回调函数中访问,因此可以对显示在操作栏、溢出菜单和/或隐藏的项目进行操作。


1
我实际上得到了不同的行为。在3.2和4.1.1上进行测试后,调用invalidateOptionsMenu()后,我会接收到对onCreateOptionsMenu()onPrepareOptionsMenu()的调用。我不认为它们一定会互相调用,但它们按照这个顺序来。因此,我将所有我的运行时更改保存在onPrepareOptionsMenu()中,在onCreateOptionsMenu()中,我只是填充菜单。在3.0之前,当用户打开菜单时,它会处理自己,在>3.0上,我只需在需要刷新ActionBar时调用invalidateOptionsMenu - Tony Chan

4

因为我最近遇到了类似的问题并在此找到了答案,所以我想为以后读者添加一些内容: 是的,onPrepareOptionsMenu仍然有效。 但是,对于Honeycomb设备,您应该只调用标准实现(即if (android.os.Build.VERSION.SDK_INT > = 11) return super.onPrepareOptionsMenu(menu);),并使用invalidateOptionsMenu()(如有必要,通过反射)和onCreateOptionsMenu(),特别是在使用showAsAction时。否则,菜单不会更新,直到打开它。例如,如果您在选择某个项目时添加了一些条目,则这些条目将在打开菜单时神奇地出现在操作栏中,而不是在选择项目时出现。取消选择和隐藏菜单项也是同样的道理。


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