在 Android 3.0 上使用 `onPrepareOptionsMenu()`
我很好奇(如果有的话)onPrepareOptionsMenu(Menu)
(通过扩展,onPreparePanel(int, View, Menu)
)在 Android 3.0+ 上使用针对 API 11 或更高版本。
我的想法如下:
Activity
的ActionBar
从onCreateOptionsMenu(Menu)
接收其内容,您可以在其中膨胀XML菜单资源,直接添加项目,或两者的某种组合。活动的任何片段也将收到此调用,并且可以选择执行相同的操作。
要更新 ActionBar 上的项目,您可以按住 Menu
实例或调用 invalidateOptionsMenu()
然后将再次调用 onCreateOptionsMenu(Menu)
。
因此,onPrepareOptionsMenu(Menu)
是否仍然只能支持不针对 API 11 或更高版本的旧版应用程序?
调用 getActionBar().hide() 和 getActionBar().show() 是否会触发对 onPrepareOptionsMenu(Menu) 的调用?
添加或删除片段是否会以某种方式触发此问题?
I'm curious as to how (if at all) onPrepareOptionsMenu(Menu)
(and by extension, onPreparePanel(int, View, Menu)
) is used on Android 3.0+ when targeting API 11 or greater.
My thinking is as follows:
An Activity
's ActionBar
receives its content from onCreateOptionsMenu(Menu)
where you can either inflate an XML menu resource, add items directly, or some combination of both. Any fragments of the activity will also receive this call and have the option of doing the same.
To update the items on the ActionBar you can either hold on to the Menu
instance or call invalidateOptionsMenu()
which will then wind up calling onCreateOptionsMenu(Menu)
again.
Thus, is onPrepareOptionsMenu(Menu)
then only still around to support legacy applications which do not target API 11 or newer?
Does calling getActionBar().hide()
and getActionBar().show()
trigger a call to onPrepareOptionsMenu(Menu)
perhaps?
Does adding or removing a fragment somehow trigger this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
根据我的广泛测试,奇怪的是,它的工作方式似乎与该平台 3.0 之前的版本完全相同,仅在打开溢出菜单时才会被调用。原始问题中列出的任何一个事件都没有触发回调。
一个可能显而易见但值得注意的事实:在此回调中可以访问整个菜单,因此可以对操作栏上、溢出菜单中可见和/或隐藏的项目进行操作。
From my extensive testing, it strangely appears to work exactly like on pre-3.0 versions of the platform, only being invoked when the overflow menu is opened. The callback did not fire on either of the events listed in the original question.
A perhaps obvious but noteworthy fact: The entire menu is accessible on this callback so manipulation of items which are visible on the action bar, in the overflow menu, and/or hidden is possible.
由于我最近有类似的问题并偶然发现了这个问题,我想为后来的读者补充一点:
是的,onPrepareOptionsMenu 仍然有效。
但是,您应该只调用 Honeycomb 设备的标准实现(即 if ( android.os.Build.VERSION.SDK_INT >= 11 ) return super.onPrepareOptionsMenu(menu);)并使用 invalidateOptionsMenu() (如果需要,通过反射) 和 onCreateOptionsMenu() 代替,特别是。使用 showAsAction 时。否则,菜单在打开之前不会更新。例如,如果您在选择某个项目时添加一些条目,则这些项目将在菜单打开时神奇地出现在操作栏中,而不是在选择该项目时。取消选择和隐藏菜单项也是如此。
Sice I recently had similar questions and stumpled upon this one, I'd like to add for later readers:
Yes, onPrepareOptionsMenu still does work.
However, you should just invoke the standard implementation for Honeycomb devices (i.e. if ( android.os.Build.VERSION.SDK_INT >= 11 ) return super.onPrepareOptionsMenu(menu);) and use invalidateOptionsMenu() (via reflection, if necessary) and onCreateOptionsMenu() instead, esp. when using showAsAction. Otherwise, the menu won't be updated until it's opened. For example, if you add some entries when an item is selected, the items will magically appear in the action bar when the menu's opened, not when the item's becoming selected. Same goes for deselection and hiding the menu items.