【问题标题】:Android: creating PopupMenu on android:onClick how to handle null ViewAndroid:在 android:onClick 上创建 PopupMenu 如何处理 null View
【发布时间】: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" 的菜单项,您可以找到它的视图。这会起作用,但这不是正确的做事方式。

【问题讨论】:

    标签: java android


    【解决方案1】:
    // try this way,hope this will help you...
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      if (item.getItemId() == R.id.action_options) {
           PopupMenu popupMenu = new PopupMenu(this, v);
           popupMenu.inflate(R.menu.settings);
           popupMenu.show();
      }
      return super.onOptionsItemSelected(item);
    }
    

    【讨论】:

    • 感谢您的回答,但这无济于事。您实际上没有在上面的代码中定义 v !更根本的是,使用 onOptionsItemSelected 并不能解决问题。我仍然有一个 MenuItem,我仍然需要一个视图。 (它具有与上述相同的行为。如果它不在操作栏中,则没有 View..)
    【解决方案2】:

    一个潜在的“解决方案”是在菜单 XML 文件中定义子菜单。

    <item android:title="options">
        <menu>
            <item android:title="action1" />
            <item android:title="action2" />
        </menu>
    </item>
    

    这适用于某些场景,最重要的是,它不是 hack 并且保证可以工作。 (但是,这不是我要寻找的具体答案..)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多