选项菜单中的onOptionsItemSelected方法返回了错误的ID

6

当我点击菜单时,上述方法返回的是第一个菜单的ID而不是我点击的菜单的ID。如果我检查菜单的Title Condensed,则是正确的。

(Newbe)

int id = item.getItemId();   //returns id of an incorrect menu
String Title = (String) item.getTitleCondensed();  //this returns the correct title.

欢迎提出任何想法。


“第一个菜单”是什么意思?这是一个子菜单吗? - Phil
2个回答

8

我曾经遇到过同样的问题。构建生成的文件没有被正确地更新。

如果我在XML中重新排列菜单项...进行构建并惊奇地发现,点击菜单会带来与预期不同的代码。

请清理并再试一次。


1
这刚刚发生在我身上 - 清理帮了我...很奇怪 - 但还是谢谢;-) - Thomas

1
你应该在onCreateOptionsMenu和onCreateContextMenu中为每个菜单项设置唯一的ID。
例如:
    public static final int CONTEXT_MENU_DELETE = Menu.FIRST;
    public static final int CONTEXT_MENU_EDIT = CONTEXT_MENU_DELETE + 1;

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

            menu.add(0, CONTEXT_MENU_DELETE, 1, R.string.delete);
            menu.add(0, CONTEXT_MENU_EDIT, 2, R.string.edit);
    }

    // And then

    @Override
    public boolean onContextItemSelected(MenuItem item) {

            switch(item.getItemId()) {

            case CONTEXT_MENU_DELETE:
                    // Delete item
                    break;

            case CONTEXT_MENU_EDIT:
                    // Edit item
                    break;
            }
    }

对于onCreateOptionsMenu和onOptionsItemSelected也是一样的。每个菜单选项都应该有一个唯一的常量。
补充:
难道你没有看过this tutorial吗? 这个想法是一样的。你应该在menu.xml中设置不同的id:
    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/new_game"
              android:icon="@drawable/ic_new_game"
              android:title="@string/new_game" />
        <item android:id="@+id/help"
              android:icon="@drawable/ic_help"
              android:title="@string/help" />
    </menu>

然后在onOptionsItemSelected中使用这些ID:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
        case R.id.new_game:
            newGame();
            return true;
        case R.id.help:
            showHelp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

查看官方Android菜单教程中的这些代码块,与您自己的代码进行比较。您还可以发布您的menu.xmlonCreateOptionsMenuonOptionsItemSelected,以便更容易地解决您的问题。


嗨,谢谢回复。我应该提到我的菜单来自menu.xml文件,所以我不分配id,它们是系统生成的,例如3124655或类似的数字。而且返回的系统ID是不正确的。 - Olan
我已经在答案中添加了资源部分。您还可以发布您的 menu.xmlonCreateOptionsMenuonOptionsItemSelected,这样就可以更容易地找出您的问题。 - Victor
您好,教程正是我开始的地方。我的菜单看起来像这样: - Olan

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