2011-05-21 50 views
21

我很好奇在针对API 11或更高版本时如何(如果有的话)onPrepareOptionsMenu(Menu)(以及扩展名为onPreparePanel(int, View, Menu))在Android 3.0+上使用。在Android 3.0+上使用`onPrepareOptionsMenu()`

我的思路如下:

ActivityActionBaronCreateOptionsMenu(Menu)接收其内容在这里你可以膨胀的XML菜单资源,直接添加项目,或两者的某种组合。活动的任何片段也将接收此调用,并可选择执行相同操作。

要更新ActionBar上的项目,您可以保留Menu实例或致电invalidateOptionsMenu(),然后再结束调用onCreateOptionsMenu(Menu)

因此,是否onPrepareOptionsMenu(Menu)然后只支持遗留应用程序不支持API 11或更新?

拨打getActionBar().hide()getActionBar().show()是否可能触发onPrepareOptionsMenu(Menu)

是否添加或删除片段以某种方式触发此?

回答

10

从我的广泛测试中,奇怪的是,它看起来和平台3.0以前的版本完全一样,只有在打开overflow菜单时才会调用它。该回调没有触发原始问题中列出的任何事件。

一个可能很明显但值得注意的事实:整个菜单可以在回调中访问,因此可以在操作栏,溢出菜单和/或隐藏处理可见的项目。

+1

我实际上得到不同的行为。在调用'invalidateOptionsMenu()'后,测试3.2和4.1.1,我调用了'onCreateOptionsMenu()',然后调用'onPrepareOptionsMenu()'。我不认为他们必须互相呼叫,但这是他们进来的顺序。因此,我在'onPrepareOptionsMenu()'和onCreateOptionsMenu()'中保留了所有运行时更改,我只对该菜单进行充气。在3.0之前,当用户打开菜单时,它会自行处理,当> 3.0时,我需要刷新ActionBar时调用'invalidateOptionsMenu'。 – 2012-10-11 00:50:00

4

SICE我最近有类似的问题,并st upon在这一个,我想补充为以后的读者: 是的,onPrepareOptionsMenu仍然工作。然而,你应该只为Honeycomb设备调用标准实现(即如果(android.os.Build.VERSION.SDK_INT> = 11)返回super.onPrepareOptionsMenu(menu);)并使用invalidateOptionsMenu()(如果需要的话,通过反射)和onCreateOptionsMenu()来代替,尤其是,当使用showAsAction。否则,菜单在打开之前不会更新。例如,如果您在选择某个项目时添加了一些条目,则在菜单打开时这些项目将奇迹般地出现在操作栏中,而不是在项目被选中时出现。取消选择和隐藏菜单项也是一样。

相关问题