gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:51 24 4
gpt4 key购买 nike

我正在创建一个音乐播放器应用,当用户想要在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使用开关盒。所以我的问题是,如果我在运行时添加了菜单项,该如何在切换情况下处理单击事件?

请提出替代方案(如果有)。谢谢。

最佳答案

通过使用如下语句

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


您可以为新菜单项分配一个id值(此处为10)。

ID值必须为正整数。就Android而言,它们不必是唯一的,但是您希望它们在上下文菜单的范围内是唯一的,以便可以在 switchonContextItemSelected(MenuItem item)子句中对其进行求值。

就您而言,您的播放列表可能已经具有数据库ID值(主键)。您可以使用它们来构建菜单项ID(我们只需添加100,以便PLAY_SONG,ADD_TO_PLAYLIST等剩下的值小于100)。

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


这样,您可以评估 switch子句中的项目ID,并确定下一步应执行的操作。

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

关于java - 如何在运行时动态生成ContextMenu项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40486937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com