Android - 在onContextItemSelelcted内的ResourcesNotFoundException

时间:2011-01-18 02:06:42

标签: android gridview

我正在尝试创建一个显示文件夹中照片缩略图的应用。我正在使用GridView来达到这个目的。我已经能够成功创建视图并用图像填充它。但是,当我尝试实现上下文菜单选项来删除所选照片时,我得到ResourcesNotFoundException。

在下面的代码中,我指出了错误发生的确切位置。任何指针都将非常感激。

谢谢!

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.photos);
    this.gridView = (GridView) findViewById(R.id.gridView);
    imageArrayAdapter = new ImageArrayAdapter(this, R.layout.thumb_item, photosList);
    this.gridView.setAdapter(imageArrayAdapter);
    registerForContextMenu(gridView);
}

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

    menu.setHeaderTitle("File Options");

    menu.add(Menu.NONE, 1, Menu.NONE, R.string.delete).
    setIcon(R.drawable.delete).
    setAlphabeticShortcut('d');
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    try {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

        // Works correctly
        Toast.makeText(this, item.getId(), Toast.LENGTH_SHORT).show();

        // Causes ResourcesNotFoundException
        Toast.makeText(this, item.getId(), Toast.LENGTH_SHORT).show();

        // Works well, prints false
        Toast.makeText(this, "" + (info == null), Toast.LENGTH_SHORT).show();

        // Causes ResourcesNotFoundException
        Toast.makeText(this, info.position, Toast.LENGTH_SHORT).show();
    } catch(Exception ignore) {
        Log.e("onContextItemSelected", ignore);
    }
    return(super.onOptionsItemSelected(item));
}

1 个答案:

答案 0 :(得分:0)

听起来Toast正在引发资源异常,因为您传递的ID(item.getId()或info.position)不是R数组中的有效字符串资源。

ContextMenu.add()的原型是:

add(int groupId, int itemId, int order, int titleRes)

所以你将“itemId”设置为1,然后尝试使用相同的id作为字符串资源ID。

您可以将itemId与所有菜单项中的标题资源ID相同 - 例如:

add(Menu.NONE, R.string.delete, Menu.NONE, R.string.delete);

我不认为这会被推荐,因为它会混淆两种不同类型的ID - 菜单项选择ID和字符串资源ID。

相反,您可以在侦听器中为菜单项和switch()设置单独的ID空间,选择适当的字符串资源ID或您需要选择的其他操作。

如果你需要的只是项目的文本,或者在你的监听器中使用MenuItem.getTitle()。