【问题标题】:How to get the View from which context menu option was selected?如何从选择了哪个上下文菜单选项中获取视图?
【发布时间】:2015-02-02 08:04:42
【问题描述】:

在我的应用中,我动态创建了一些视图,并且它们都注册了相同的上下文菜单。

for(int j = 0; j < CELLS_IN_ROW; j++) {
    MyView v = new MyView();
    ((Activity) context).registerForContextMenu(v);
}
/* ----------------------------------------------- */


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

    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.cell_context_menu, menu);
}

    @Override
    public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.myOption:
            MyView viewClicked = ?????

            doSomethingDependingOnView(viewClicked);
            return true;

        default:
            return super.onContextItemSelected(item);
    }
}

但是当单击菜单选项时,我想根据单击哪个视图打开上下文菜单来执行不同的操作。我该怎么做?

【问题讨论】:

  • MyView v = new MyView(); v.setID(j);您将从 viewClicked.getId() 获取 Switch 语句中的 id
  • @koutuk:不...查看编辑后的代码。以及如何获得 viewClicked?它没有初始化...
  • final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this .findViewById(android.R.id.content)).getChildAt(0); viewGroup.addView(v);试试这个来添加视图然后为每个视图设置 CLICK 列表

标签: java android menu contextmenu


【解决方案1】:

由于它的参数view,当您的 onCreateContextMenu 启动时,您在 clickedView 上有了引用。

onCreateContextMenu(ContextMenu cM, View view, ContextMenuInfo cMI)

所以你必须在你的Activity(或Fragment)中声明一些View的变量, 那么你应该在 onCreateContextMenu 中初始化那个,最后你可以在 onContextItemSelected 中使用它

MyView viewClicked;

@Override
public void onCreateContextMenu(ContextMenu menu, 
                           View view, // this is your clicked view
                           ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.cell_context_menu, menu);
viewClicked = view; // <---!!!

}

@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case R.id.myOption:

        viewClicked.someMethod();

        doSomethingDependingOnView(viewClicked);
        return true;
    default:
        return super.onContextItemSelected(item);
}

}

【讨论】:

  • 完美答案非常感谢。
【解决方案2】:

试试这个:

@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case R.id.myOption:

        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        MyView viewClicked = (MyView) info.targetView;      

        doSomethingDependingOnView(viewClicked);
        return true;

    default:
        return super.onContextItemSelected(item);
}

【讨论】:

  • getMenuInfo() 返回 null... 我放弃了。我将在 View 类中使用 onLongClickListener 和 DialogBu​​ilder 来完成。
【解决方案3】:

不是最好的方法,但似乎是唯一可行的方法:

// create a global variable
Button clickedButton = null;

// save the button
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    clickedButton = (Button) v;
}

// do something with the clickedButton
@Override
public boolean onContextItemSelected(MenuItem item) {
    doSomethingDependingOnView(clickedButton);
    return true;
}

【讨论】:

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