我有一个带有2个片段的TabHost,两个都列出了。 onCreateContextMenu可以很好地工作,但是两个onContextItemSelected都“指向”第一个Fragment类。我为XML文件中的列表使用了不同的名称,因此ID不相同。

这是两个onCreateContextMenu的代码

@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        int itemID = info.position;

        Map m = (HashMap) this.listView.getAdapter().getItem(itemID);

        menu.setHeaderTitle(getString(R.string.options));
        menu.add(0, v.getId(), 0, activity.getString(R.string.delete));
    }


在这里,第一个片段的onContextItemSelected,第二个片段几乎是相同的代码,只是更改了var名称。实际上,这并没有改变任何问题,因为即使在第二个列表上,此方法也只能在第一个Fragment上运行。

@Override
    public boolean onContextItemSelected(MenuItem item) {
        ContextMenuInfo menuInfo = (ContextMenuInfo) item.getMenuInfo();
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        int itemID = info.position;
        Map m = (HashMap) this.listView.getAdapter().getItem(itemID);
        processId = Integer.parseInt(m.get("processId").toString());

        activity.setSupportProgressBarIndeterminateVisibility(true);
        runBackground(activity.getString(R.string.accessingECM), false, false, ACTION_REMOVE);
        return true;
    }


这就是我在onActivityCreated方法上注册上下文菜单的方式。请注意,onCreateContextMenu对两个片段都适用。

listView = (ListView) this.view.findViewById(R.id.listProcess);
        registerForContextMenu(listView);


我试图将menu.add()第1和第3参数更改为(1,1)和(1,2)。还尝试了两者都是Menu.NONE。仍然不起作用。

谢谢

最佳答案

对于Tabhost(以我的经验),您需要在TabHost的活动中设置一个onCreateContextMenu,并使用开关来获取适当的菜单/操作。

例:

// ***************************************************************
// Create the various context menus depending on which list it is from
// ***************************************************************
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    switch (v.getId()) {
    case R.id.list1: {
        menu.setHeaderTitle("Tool CC Menu");
        menu.add(0, v.getId(), 0, "Edit/Add Cutter Comp Info");
        menu.add(0, v.getId(), 0, "Clear Cutter Comp Info");
        break;
    }
    case R.id.list2: {
        menu.setHeaderTitle("WPC Menu");
        menu.add(0, v.getId(), 0, "Edit WPC Info");
        menu.add(0, v.getId(), 0, "Clear WPC Info");
        break;
    }
    }
}
// ***************************************************************
// Create the various context menu actions based on which list
// ***************************************************************
@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
            .getMenuInfo();
    cc_id_int = (int) info.id;
    if (item.getTitle() == "Edit/Add Cutter Comp Info") {
        showDialog(CCEDIT_DIALOG_ID);
    } else if (item.getTitle() == "Clear Cutter Comp Info") {
        showDialog(CLEARCC_DIALOG_ID);
    } else if (item.getTitle() == "Edit WPC Info") {
        removeDialog(WPCEDIT_DIALOG_ID);
        showDialog(WPCEDIT_DIALOG_ID);
    } else if (item.getTitle() == "Clear WPC Info") {
        showDialog(CLEARWPC_DIALOG_ID);
    }
    return super.onContextItemSelected(item);
}


希望这可以帮助!

10-06 00:56