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

标签 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使用开关盒。所以我的问题是,如果我在运行时添加了菜单项,该如何在切换情况下处理单击事件?

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

最佳答案

通过使用如下语句

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/

相关文章:

java - Android:如何使用警报管理器

WPF:为空时隐藏 ContextMenu

android - Fragment 中的上下文菜单使用来自不同 Fragment 的 ListView : registerForContextMenu(getListView())

java - 3 个最大数字的数组

java - 从另一个 Activity 返回时 ArrayList 为 null

android - VideoView 仅在 Galaxy s4 上不循环播放视频

wpf - HierarchicalDataTemplate.ItemTemplate 中的水平拉伸(stretch) WPF ContextMenu MenuItem

java.lang.IllegalStateException : android.accessibilityservice.AccessibilityService.getSystemService(AccessibilityService.java:1602)

java - 在 Android 应用程序上创建向下滑动动画的最佳方式?

java - Android、apk 安装 INSTALL_FAILED_POLICY_REJECTED_PERMISSION