Android - исключение ResourcesNotFoundException внутри onContextItemSelelcted - PullRequest
0 голосов
/ 18 января 2011

Я пытаюсь создать приложение, которое отображает эскизы фотографий в папке.Я использую 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 голосов
/ 18 января 2011

Похоже, что Toast вызывает исключение ресурса, потому что идентификатор, который вы передаете (item.getId () или info.position), не является допустимым строковым ресурсом в вашем массиве R.

Прототип для ContextMenu.add ():

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

поэтому вы устанавливаете "itemId" в 1, а затем пытаетесь использовать тот же идентификатор в качестве идентификатора строкового ресурса.

Возможно, вы сможете сделать itemId таким же, как идентификатор ресурса заголовка во всех ваших пунктах меню, например:

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

Я не думаю, что это было бы рекомендовано, поскольку это смешивает два разных типа идентификаторов - идентификаторы выбора пунктов меню и идентификаторы строковых ресурсов.

Вместо этого вы можете иметь отдельное пространство идентификаторов для пунктов меню и включать их в своем прослушивателе (), выбирая соответствующие идентификаторы строковых ресурсов или другие действия, которые необходимо выполнить при выборе.

Или используйте MenuItem.getTitle () в вашем слушателе, если все, что вам нужно, это текст элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...