我创建了一个音乐播放器应用,我希望在用户想要在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);
}
这里我为每个菜单项ID使用switch case。所以我的问题是如果我在运行时添加了菜单项,如何处理切换案例中的点击事件?
请提出替代方案。谢谢。
答案 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