Как динамически генерировать элементы ContextMenu во время выполнения?

Я создаю приложение «Музыкальный проигрыватель» и хочу отображать имена доступных списков воспроизведения, когда пользователь хочет добавить любую песню в список воспроизведения, в contextMenu.

Таким образом, весь сценарий таков: когда пользователь долго нажимает на любую песню, отображается contextMenu с одним из вариантов с именем Add to playList. Когда пользователь щелкает этот пункт меню, отображается другой contextMenu с параметрами Create a new PlayList и именами ранее доступных плейлистов (если они есть).

Моментальный снимок:

введите здесь описание изображения

Теперь проблема в том, чтобы показать имена ранее сохраненных списков воспроизведения, я думаю, что мне нужно динамически генерировать эти элементы меню во время выполнения. Мой код добавления пунктов меню:

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

    if(contextMenuFlag){

        menu.setHeaderTitle(songToDisplay);
        menu.add(Menu.NONE, PLAY_SONG, Menu.NONE, "Play");
        menu.add(Menu.NONE, ADD_TO_PLAY_LIST, Menu.NONE, "Add to Playlist");
    }
    else{
        contextMenuFlag = true;
        menu.setHeaderTitle("Add to Playlist");
        menu.add(Menu.NONE, CREATE_PLAYLIST, Menu.NONE, "-Create a new Playlist");
        menu.add(Menu.NONE, 10, Menu.NONE, "Old Playlists if exists");
    }
    //Toast.makeText(MainActivity.this,v+"",Toast.LENGTH_SHORT).show();
}

Здесь, используя цикл, я думаю, что могу динамически добавлять пункты меню. Но проблема заключается в обработке событий щелчка по пунктам меню. Код обработки этого события:

    @Override
public boolean onContextItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case PLAY_SONG: {
            songClick(MyView);
        }
        break;
        case ADD_TO_PLAY_LIST: {

            contextMenuFlag = false;
            songView.post(new Runnable() {

                @Override
                public void run() {
                    songView.showContextMenu();
                }
            });
        }
        break;
        case CREATE_PLAYLIST:{
            addToPlayList();
        }
        break;
    }
    return super.onContextItemSelected(item);
}

Здесь я использую регистр переключения для каждого идентификатора пункта меню. Итак, мой вопрос: как обрабатывать события щелчка в случае переключения, если я добавил пункты меню во время выполнения?

Пожалуйста, предложите альтернативы, если таковые имеются. Спасибо.


person Community    schedule 08.11.2016    source источник
comment
В основном вы присваиваете значение идентификатора элементам меню при их добавлении (2-й параметр). Таким образом, вы используете уникальные значения (идентификатор базы данных списка воспроизведения?) и, таким образом, сможете определить, какой элемент был нажат.   -  person Bö macht Blau    schedule 08.11.2016
comment
можешь привести пример кода?   -  person    schedule 08.11.2016
comment
о каком втором параметре ты говоришь? @0X0nosugar   -  person    schedule 08.11.2016


Ответы (1)


Используя утверждения, подобные следующим

menu.add(Menu.NONE, 10, Menu.NONE, "Old Playlists if exists");

вы присваиваете значение идентификатора (здесь: 10) новому пункту меню.

Значения идентификаторов должны быть положительными целыми числами. Они не обязательно должны быть уникальными с точки зрения Android, но вы захотите, чтобы они были уникальными в рамках вашего контекстного меню, чтобы вы могли оценить их в предложении switch в onContextItemSelected(MenuItem item).

В вашем случае ваши списки воспроизведения, вероятно, уже имеют значения идентификатора базы данных (первичные ключи). Вы можете использовать их для создания идентификаторов пунктов меню (давайте просто добавим 100, чтобы у вас осталось несколько значений ‹ 100 для PLAY_SONG, ADD_TO_PLAYLIST и т. д.)

menu.add(Menu.NONE, 100 + playlist_dbid, Menu.NONE, myPlaylistName);

Таким образом, вы можете оценить идентификатор элемента в предложении switch и определить, что следует делать дальше.

@Override
public boolean onContextItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case PLAY_SONG: {
            songClick(MyView);
        }
        break;
        case ADD_TO_PLAY_LIST: {

            contextMenuFlag = false;
            songView.post(new Runnable() {

                @Override
                public void run() {
                    songView.showContextMenu();
                }
            });
        }
        break;
        case CREATE_PLAYLIST:{
            addToPlayList();
        }
        break;
        default: // so user tapped on a specific playlist
                 // get the playlist database id by reverting the 
                 // step for building the item id
            int playlist_dbid  = item.getItemId() - 100;
            doSomethingWithPlaylist(playlist_dbid);
    }
    return super.onContextItemSelected(item);
}
person Bö macht Blau    schedule 08.11.2016