【问题标题】:Hide Android Context Menu Item隐藏 Android 上下文菜单项
【发布时间】:2010-11-18 16:01:41
【问题描述】:

另一个新手问题。我有一个上下文菜单,我申请了一个 ListView,它只允许用户向上或向下移动项目,或删除项目。

我在 onContextItemSelected() 中有代码,以防止事物向上移动到列表的顶部或底部等,但我宁愿首先隐藏上下文菜单项,如果(例如)顶部项目列表被选中。

我假设我需要在 onCreateContextMenu 中执行此操作,但我不确定如何操作。

这是我的 onCreateContextMenu 代码:

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.mycontextmenu, menu);
}

谢谢,
wTs

【问题讨论】:

    标签: android contextmenu


    【解决方案1】:

    在您的onCreateContextMenu 方法中,您需要获取您可能想要隐藏的菜单项,并根据列表位置将它们设置为不可见。

    类似这样的:

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    
    if(info.position < 1) {
       myLocationMenuItem = menu.findItem(R.id.myLocation);
       myLocationMenuItem.setVisible(enable);
    }
    

    【讨论】:

      【解决方案2】:

      这是PopupMenu 的解决方案,以防有人像我一样寻求它。在这里,我在 menu 布局文件中有 3 个按钮,用于 PopupMenu,在某些情况下我删除了其中一些按钮:

          PopupMenu popup = new PopupMenu(this, this.actionButton);
          popup.setOnMenuItemClickListener(this);
          MenuInflater inflater = popup.getMenuInflater();
          inflater.inflate(R.menu.menu_resume_view, popup.getMenu());
      
          Menu menu = popup.getMenu();
          if (this.resume.isPublished()) {
              menu.removeItem(R.id.menu_button_publish);
          }
          else {
              menu.removeItem(R.id.menu_button_unpublish);
              menu.removeItem(R.id.menu_button_update_publish_date);
          }
      
          popup.show();
      

      当您使用PopupMenu 时,不会调用onPrepareOptionsPanel。因此,您必须在创建 PopupMenu 时通过 id 获取菜单项并删除它们,这在特定情况下不应该可用。

      【讨论】:

      • 您好,如果我们只使用图标,我该如何删除标题空间? gist.github.com/mediavrog/9345938
      • menu.getItem(int i) 需要索引,但 menu.removeItem(int i) 需要 id。嘘
      【解决方案3】:

      如果为ListView 打开上下文菜单,menuInfo 将包含AdapterContextMenuInfo 类型的对象,它会为您提供有关单击列表中的哪个项目的信息。如果它是第一项或最后一项,您可以简单地从上下文菜单中删除相应的条目,但我不太确定如果没有留下任何条目会发生什么。

      【讨论】:

      • 为了以后的搜索...使用 AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) menuInfo;
      • 如果您不想根据请求上下文的行显示特定项目的任何上下文菜单,只需在扩展菜单之前返回 onCreateContextMenu()。
      【解决方案4】:

      您可以根据需要禁用特定项目。

      @Override
              public void onCreateContextMenu(ContextMenu menu, View v,
                      ContextMenuInfo menuInfo)
           {
                      AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
      
                      int position = info.position;
      
                      // use this position to decide your item clicked
      
                      menu.clear();
                      menu.setHeaderTitle("Context Menu Title");
                      String[] menuItems = getResources().getStringArray(
                              R.array.menu_context);
      
      
                      for (int i = 0; i < menuItems.length; i++)
                      {
                          menu.add(Menu.NONE, i , i, menuItems[i]);
                      }
                     menu.getItem(0).setEnabled(**Conditional check**);
                     menu.getItem(1).setEnabled(**Conditional check**);
                     menu.getItem(2).setEnabled(**Conditional check**);
           }
      

      【讨论】:

        猜你喜欢
        • 2018-11-10
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        相关资源
        最近更新 更多