如何获取选择上下文菜单选项的视图?

4

在我的应用中,我动态创建一些视图,这些视图都已经注册了相同的上下文菜单。

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
@koutuk:不是这样的...看一下修改后的代码。而且如何获取viewClicked?它没有被初始化... - micnyk
最终的ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this .findViewById(android.R.id.content)).getChildAt(0); viewGroup.addView(v); 尝试使用此方法添加视图,然后为每个视图设置点击监听器。 - koutuk
3个回答

3

当您的onCreateContextMenu被启动时,由于其参数view,您可以在所点击的视图上找到引用。

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);
}

}


完美的答案,非常感谢。 - Wowo Ot

0

试试这个:

@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和DialogBuilder来完成它。 - micnyk

0

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

// 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接