如何在运行时动态生成ContextMenu项?

时间:2016-11-08 12:26:14

标签: java android contextmenu playlists

我创建了一个音乐播放器应用,我希望在用户想要在contextMenu中将任何歌曲添加到播放列表时显示可用播放列表的名称。

  

所以整个场景是:当用户长按任何歌曲时,会显示contextMenu,其中包含一个名为Add to playList的选项。当用户单击该菜单项时,会显示另一个contextMenu个选项Create a new PlayList和以前可用的播放列表名称(如果有)。

快照:

enter image description here

现在的问题是,为了显示以前存储的播放列表的名称,我想我必须在运行时动态生成此菜单项。我添加菜单项的代码是:

    @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);
}

这里我为每个菜单项ID使用switch case。所以我的问题是如果我在运行时添加了菜单项,如何处理切换案例中的点击事件?

请提出替代方案。谢谢。

1 个答案:

答案 0 :(得分:0)

使用以下语句

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

将id值(此处为10)分配给新菜单项。

Id值必须为正整数。就Android而言,它们不必是唯一的,但您希望它们在上下文菜单的范围内是唯一的,因此您可以在switch的{​​{1}}子句中对它们进行评估。

在您的情况下,您的播放列表可能已经有数据库ID值(主键)。您可以使用它们来构建菜单项ID(让我们只需添加100,这样您就可以为PLAY_SONG,ADD_TO_PLAYLIST等留下一些值<100)。

onContextItemSelected(MenuItem item)

这样,您可以评估menu.add(Menu.NONE, 100 + playlist_dbid, Menu.NONE, myPlaylistName); 子句中的项ID,并确定接下来应该做什么。

switch