Android ContextMenu for View(非活动)

时间:2011-08-12 16:38:13

标签: android view contextmenu

我正在使用以下方法将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");


    }

};


  } 

5 个答案:

答案 0 :(得分: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 :(得分: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:
      }
}

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

答案 2 :(得分: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);
        }
    }

答案 3 :(得分: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();
        ...
    }
}

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

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

答案 4 :(得分:-1)

在给主要布局充气后(在'onCreate中),你可以从活动中为你的View指定一个变量。

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

接下来,执行registerForContextMenu(myView);

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