【发布时间】:2014-05-09 20:00:56
【问题描述】:
似乎有很多相关的问题,但没有完全匹配的问题。就这样吧。。
我有一个非常简单的带有 ActionBar 的 Android 应用。该操作栏包含一些菜单项。单击其中一些时,我希望创建一个带有其他选项的 PopupMenu。简单的?好吧,没有..
下面是 ActionBar 菜单的相关 XML 代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_menu" >
...
<item android:id="@+id/action_options"
android:icon="@drawable/ic_action_settings"
android:title="@string/mb_options"
android:showAsAction="ifRoom"
android:onClick="onPressOptions" />
</menu>
当我按下菜单按钮时,确实会调用 onPressOptions 方法。到目前为止很好......但是,onPressOptions 方法将 MenuItem 作为其参数,而不是视图。创建 PopupMenu 需要一个 View 来锚定它。
是否有任何标准策略可以从 MenuItem 中获取某种有效的View?以下是我使用的。
public void onPressOptions(MenuItem mi) {
// Get the view of the menu item
View v = this.findViewById(R.id.action_options);
// If we have no view!
if(v == null) {
// PROBLEM!!
}
PopupMenu popupMenu = new PopupMenu(this, v);
popupMenu.inflate(R.menu.settings);
popupMenu.show();
}
如果 MenuItem 实际显示在 ActionBar 中,上面的代码可以完美运行。如果不是,则 findViewById 返回 null! This happens when the options menu item is the overflow.我应该在这里做什么?这甚至是正确的方法吗?
(我可以使用一些技巧来避免程序崩溃。但我最感兴趣的是这里的正确解决方案..)
编辑:有人吗?请.. 一种黑客解决方案是将弹出菜单锚定到您知道在操作栏中可见的视图。例如,如果有一个带有 android:showAsAction="always" 的菜单项,您可以找到它的视图。这会起作用,但这不是正确的做事方式。
【问题讨论】: