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