【问题标题】:Use of `onPrepareOptionsMenu()` on Android 3.0+在 Android 3.0+ 上使用 `onPrepareOptionsMenu()`
【发布时间】:2011-05-21 06:37:26
【问题描述】:

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

我的想法如下:

ActivityActionBaronCreateOptionsMenu(Menu) 接收其内容,您可以在其中扩充 XML 菜单资源、直接添加项目或两者兼而有之。 Activity 的任何片段也将收到此调用,并且可以选择执行相同操作。

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

因此,onPrepareOptionsMenu(Menu) 是否仍然只支持不针对 API 11 或更高版本的旧版应用程序?

调用getActionBar().hide()getActionBar().show() 是否会触发对onPrepareOptionsMenu(Menu) 的调用?

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

【问题讨论】:

    标签: android android-fragments android-3.0-honeycomb


    【解决方案1】:

    根据我的大量测试,奇怪的是,它的工作方式与平台 3.0 之前的版本完全一样,只是在打开溢出菜单时才被调用。原始问题中列出的任何一个事件都没有触发回调。

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

    【讨论】:

    • 我实际上得到了不同的行为。在 3.2 和 4.1.1 上进行测试,在调用 invalidateOptionsMenu() 后,我接到了 onCreateOptionsMenu() 的电话,然后是 onPrepareOptionsMenu()。我认为他们不一定会互相打电话,但这就是他们进来的顺序。因此,我将所有运行时更改都保存在onPrepareOptionsMenu() 中,而在onCreateOptionsMenu() 中我只扩展菜单。在 pre-3.0 上,当用户打开菜单时,它会自行处理,而在 >3.0 上,当我需要刷新 ActionBar 时,我只需调用 invalidateOptionsMenu
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多