在我问这个问题之前,让我提供一些额外的信息:
我有一个片段,它MenuItem
在onCreateOptionsMenu
. 添加的 MenuItem 还ActionProvider
添加了一个自定义项。
自定义ActionProvider
不使用 ActionView 而是准备一个SubMenu
带有某些项目以供选择。出于这个原因,我设置ActionProvider
如下:
- 我
null
在onCreateActionView
方法中返回 hasSubMenu()
返回true
- 在
onPrepareSubMenu(SubMenu Menu)
我首先清除当前菜单,然后添加所需的项目 - 我正确处理
onMenuItemClick
了 ActionProvider 中的 - 因为我使用的是 ActionBarSherlock,所以我的 ActionProvider 扩展了
com.actionbarsherlock.view.ActionProvider
(android.support.v4.view.ActionProvider
不知道它是否应该有任何区别,但此时我不知道有什么作用)
这一切在 Android 版本高于 3.0 的设备上运行良好。我看到添加的MenuItem
,它具有正确的SubMenu
(来自绑定的ActionProvider
)并且每个菜单选项都发生了正确的操作。但是对于运行低于 3.0 的 Android 版本的设备(我只能在运行 2.3.6 的设备上进行测试),会发生一些奇怪的事情;因此下面的问题。
谷歌明确指出:
“onPerformDefaultAction()
当从动作溢出中选择菜单项并且动作提供者应该为菜单项执行默认动作时,系统调用它。但是,如果您的操作提供程序通过 onPrepareSubMenu() 回调提供子菜单,则即使将操作提供程序置于操作溢出中,子菜单也会出现。因此,当有子菜单时,永远不会调用 onPerformDefaultAction()。”
取自:http: //developer.android.com/guide/topics/ui/actionbar.html#CreatingActionProvider
从我认为的摘录中,onPerformDefaultAction()
永远不要在我的自定义 ActionProvider 中调用它。然而,在运行 Android 版本 2.3.6 的设备上,onPerformDefaultAction()
确实会调用,这也阻止了SubMenu
显示。
我的问题是;为什么onPerformDefaultAction()
调用而不是调用onPrepareSubMenu(SubMenu Menu)
?我也需要运行 Android 2.3.6 的设备上的子菜单..
编辑:
我设法使用SubMenus.java
来自 ActionbarSherlock 演示代码的相同技术解决了我的问题。这涉及将 aSubMenu
而不是自定义 ActionProvider 添加到 中的菜单onCreateOptionsMenu(Menu menu)
,并附OnMenuItemClickListener
加到那里的每个 MenuItem。
解决方法很简单。尽管如此,这并不能回答我关于为什么自定义 ActionProviders 不起作用的问题。