从oncontextitemselected获取视图ID

时间:2011-05-16 11:16:45

标签: android contextmenu

我为上下文菜单注册了几个按钮

如何知道单击了哪个按钮才能显示菜单?

下面是我将要使用的伪代码。我需要做一些与点击哪个按钮相关的事情(我还有几个按钮要声明),我怎么知道上下文菜单是从哪个按钮点击激活的。

编辑:我想我没有说清楚,我想知道单击了哪个按钮才能显示菜单。不是单击哪个菜单项。无论如何,我很快就会添加一个解决方案。

感谢

private static final int SEND_AS_TEXT = Menu.FIRST;
private static final int SEND_AS_IMAGE = Menu.FIRST + 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        sendAllBtn = (Button)findViewById(R.id.sendAllBtn);
        sendAllBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        registerForContextMenu(v);
        openContextMenu(v);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        switch(item.getItemId()){
        case SEND_AS_TEXT:
            //do sth related to the button clicked
            break;

        }
        return super.onContextItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(Menu.NONE, SEND_AS_TEXT, SEND_AS_TEXT, "Send As Text");
        menu.add(Menu.NONE, SEND_AS_IMAGE, SEND_AS_IMAGE, "Send As Image");
    }

5 个答案:

答案 0 :(得分:12)

好的,非常感谢其他人的帮助,这些帮助清除了我对getItemId的怀疑,因为它返回了我分配给菜单项的ID。 就我而言,我想知道在创建上下文菜单之前单击了哪个按钮。

为此,我只需创建一个长变量来存储单击的按钮。可以按以下方式获取按钮的ID:

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    // TODO Auto-generated method stub
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Send As..");
    menu.add(Menu.NONE, SEND_AS_TEXT, SEND_AS_TEXT, "Send As Text");
    menu.add(Menu.NONE, SEND_AS_IMAGE, SEND_AS_IMAGE, "Send As Image");
    btnId = v.getId(); //this is where I get the id of my clicked button
}

以后我只需要参考这个btnId来做我想做的事。

答案 1 :(得分:4)

我认为使用特定视图的ID更有意义。假设您已经填充了包含您的数据的项目的ListView,但是在您创建了分隔符/标题的一些项目之间。您不希望分隔符处理点击/长按。

在某些情况下,只需引用“position”或MenuInfo.id即可,但根据您的数据结构,您可能需要更多控制权。

您可以做的是为ListView中的项目/视图设置ID(view.setId(x),其中x表示数据结构/对象的ID /位置。然后,在创建ContextMenu并处理选择时在其中执行以下操作以读取该ID:

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

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    int id = info.targetView.getId();

    // now you can refer to your data with the correct ID of yours
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    int id = info.targetView.getId();

    // now you can refer to your data with the correct ID of yours
}

答案 2 :(得分:1)

如果您要查找基础数据的ID(由适配器的getItemId(int)提供),那么只需在onContextItemSelected方法中添加以下行:

final AdapterView.AdapterContextMenuInfo info = 
  (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
final long datasId = info.id    // get datas id

答案 3 :(得分:0)

@Override
public boolean onContextItemSelected(MenuItem item) {
    item.getItemId();
    return super.onContextItemSelected(item);
}

答案 4 :(得分:0)

试试这个......

@Override
public boolean onContextItemSelected(MenuItem item)
 {
    if(item.getItemId()==SEND_AS_TEXT)
    {
        //code for send text
    } 
    else if(item.getItemId()==SEND_AS_IMAGE)
    {
       //code for send image
    }
    return super.onContextItemSelected(item);
}