Android 无法访问菜单项值-包装在V7 MenuItemWrapperJB中
所以我在谷歌上搜索了几个星期,我不明白为什么我的菜单项被包装在一个包装器对象中,这意味着我无法通过menuItem.getItemId方法访问诸如item id之类的值。真正让我困惑的是,我以前使用的是浮动上下文菜单,它工作得很好 这是我用来访问项目id的代码Android 无法访问菜单项值-包装在V7 MenuItemWrapperJB中,android,android-listview,android-actionmode,Android,Android Listview,Android Actionmode,所以我在谷歌上搜索了几个星期,我不明白为什么我的菜单项被包装在一个包装器对象中,这意味着我无法通过menuItem.getItemId方法访问诸如item id之类的值。真正让我困惑的是,我以前使用的是浮动上下文菜单,它工作得很好 这是我用来访问项目id的代码 @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId())
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.submit: ...
它给我的对象的确切类型是:android.support.v7.view.menu.MenuItemWrapperJB
如果菜单项但调用getMenuId方法返回类似2131558592的数字,则所有后续崩溃都与我使用id查询SQLite DB有关
编辑-我的问题是为什么这个包装器对象在这里,以及如何从中获取我想要访问的对象,即项目
编辑2-好吧,让我困惑的是,当我使用浮动上下文菜单时,包装器不在那里。真正的问题是,我无法使用item.getMenuInfo通过包装器在列表视图中获取所选项目的id,而我以前可以(通过浮动上下文菜单)获取该id
提前感谢您的帮助。在AppCompat库中转换视图的正确方法: 例如,强制转换搜索视图
MenuItem menuItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
所以你需要投你提交的意见。希望能有帮助
我无法通过menuItem.getItemId方法访问项id等值
当然可以。否则,您的代码将无法编译
它给我的对象的确切类型是:android.support.v7.view.menu.MenuItemWrapperJB
这是因为您使用的是appcompat-v7
,尽管它似乎与您的问题无关
所有后续的崩溃都与我使用id查询SQLite数据库有关,如果菜单项
如果您直接用Java代码创建菜单项,那么您所描述的并不是完全疯狂的。但是,如果通过菜单资源定义菜单项,则会生成R.id
值。随着您更改应用程序中的资源组合,这些值将随着版本的不同而变化。持久化这些值(例如在数据库中)将无法可靠地工作
如何从包装器中取出所需的对象
你没有MenuItem
是一个接口;您可以在接口上调用方法,而不管其底层实现如何。从技术上讲,您一开始并不知道它是一个包装器,尽管类名确实暗示了这一点
首先,它为什么在那里
如果您对菜单资源进行了扩展,则MenuInflater
的appcompat-v7
版本可能会取代它自己的MenuItem
实现,作为后端口操作栏支持的一部分
如果您在Java代码中创建了
MenuItem
,通过调用add()?2131558592是R.id.submit
的prolly值。好吧,也许那部分不相关,但我如何才能从包装器中取出我需要的对象,为什么它首先在那里,也许我应该更清楚我的问题包装,那又怎样?你为什么要为这个(实现)而烦恼?MenuItem是一个接口…好的,我开始看到这个问题了。我似乎犯了可怕的逻辑错误。谢谢你这么清楚!因此,我不确定是否会通知您我的许多编辑,但您是提出此问题的人。因此,我无法使用item.getMenuInfo方法访问列表视图中所选项目的ID,因为它返回null。使用support v7 business时是否有其他方法访问ID?@Jack.Ramsden:“我无法使用item.getMenuInfo方法访问列表视图中所选项目的ID,因为它返回null”--天哪,我已经多年没有看到使用getMenuInfo()
。我不知道它通常与动作模式一起工作,更不用说在onActionItemClicked()
中特别工作了,如果您试图调用它的话。哦,我明白了,我只是使用了错误的方法。谢谢你的帮助。