用于查看的Android ContextMenu(非活动)

问题描述 投票:3回答:6

我正在使用以下方法将ContextMenu添加到我已构建的自定义视图中,但是我想知道如何响应该上下文菜单。

这不是活动,所以我不能这样做:

  @override
  public boolean onOptionsItemSelected(MenuItem item) {

这里是代码

 private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {

    @Override
    public void onCreateContextMenu(ContextMenu arg0, View arg1,
            ContextMenuInfo arg2) {
        // TODO Auto-generated method stub
        arg0.add(0, 0, 0, "Call");
        arg0.add(0, 1, 0, "Map");
        arg0.add(0, 2, 0, "Market");


    }


};

更新:

这是我班上的非常简化的版本。

 public final class NewView extends View {



 public NewView(Context context, AttributeSet attrs) {
    super(context, attrs);
    cntxt = context;
    this.setLongClickable(true);
    this.setOnLongClickListener(vLong);
    this.setOnCreateContextMenuListener(vC);


 }

private View.OnLongClickListener vLong = new View.OnLongClickListener() {
    public boolean onLongClick(View view) {
        showContextMenu();
             return true;   
    }
 };  
 private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {

    @Override
    public void onCreateContextMenu(ContextMenu arg0, View arg1,
            ContextMenuInfo arg2) {
        // TODO Auto-generated method stub
        arg0.add(0, 0, 0, "Call");
        arg0.add(0, 1, 0, "Map");
        arg0.add(0, 2, 0, "Market");


    }

};


  } 
android view contextmenu
6个回答
2
投票

使用item.getItemId()并根据switch返回的数字创建casesgetItemId()

这样的事情。

 @override
  public boolean onOptionsItemSelected(MenuItem item) {

      switch(item.getItemId())
      {
         case 1:
               Log.i("FIRST ITEM: ", "CALL");
               break;
         case 2: 
                Log.i("2nd ITEM: ", "MAP");
                break;
          case 3:
               Log.i("3rd ITEM: ", "Market");
               break;
         default:
      }
}

我希望这就是对菜单项选择做出反应的意思。 :)


3
投票

[似乎没有人完全回答TS的问题(最终是我的),因此让我发布对此的解决方案。给定上面的代码,您可以附加自定义MenuItem的点击处理程序:

private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {

        menu.add(0, 0, 0, "Call")
                .setOnMenuItemClickListener(mMenuItemClickListener);
        menu.add(0, 1, 0, "Map")
                .setOnMenuItemClickListener(mMenuItemClickListener);
        menu.add(0, 2, 0, "Market")
                .setOnMenuItemClickListener(mMenuItemClickListener);

    }
};  

private OnMenuItemClickListener mMenuItemClickListener = new OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {

            switch (item.getItemId()) {
            case 0:
                // do "Call"
                return true;

            case 1:
                // do "Map"
                return true;

            case 2:
                // do "Market"
                return true;
            }

            return false;
        }
    };
};

1
投票

这在Android中似乎是一个奇怪的不一致之处-一个View可以创建一个上下文菜单,但是对所述菜单的处理只能在完全不同的代码中进行?

我也在用setOnMenuItemClickListener()解决这个问题。该文档表明这是合理的,但是如果您使用的是MenuInflater,则需要进行设置。

    public void onCreateContextMenu(final ContextMenu menu, final View v,
            final ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        final MenuInflater menuInflater = this.menuInflater;
        menuInflater.inflate(R.menu.context_date, menu);

        final int length = menu.size();
        for (int index = 0; index < length; index++) {
            final MenuItem menuItem = menu.getItem(index);
            menuItem.setOnMenuItemClickListener(this);
        }
    }

0
投票

在视图中:让您的视图实现ContextMenuInfo

public class MyView extends View implements ContextMenuInfo

然后,重写getContextMenuInfo以返回您的视图。

@Override
protected ContextMenuInfo getContextMenuInfo() {
    return  this ;
}

在您的活动中:为ContextMenu注册视图。

registerForContextMenu(myView);

然后在您的活动onContextItemSelected中访问视图。

    public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        ...
        case R.id.action_ctx_wordview_read_tts:
             MyView myView = (MyView) item.getMenuInfo();
        ...
    }
}

注意:当我向MyView添加onClickListener时,contextMenu停止工作。我必须添加以下代码来解决问题。

  tvWord.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return false;
        }
    });

0
投票

我做的也一样,但是上下文菜单只闪烁了e一段时间,然后消失了。所以我无法选择任何选项。您有解决方案吗?


-1
投票

您可以在为主布局(在onCreate中)充气后,从活动中为View分配一个变量。

myView = (View) findViewById(R.id.my_view);

下一步,执行registerForContextMenu(myView);

最后,您可以覆盖onCreateContextMenu,您可以在其中添加上下文菜单出现时的操作。

© www.soinside.com 2019 - 2024. All rights reserved.