【问题标题】:MediaPlayer Play/Stop in ListviewMediaPlayer 在列表视图中播放/停止
【发布时间】:2014-01-15 15:31:45
【问题描述】:

情况:

我有一个应用程序,它有几个元素的自定义列表视图,这些元素有一个播放按钮来播放相应的媒体。就其本身而言,这很有效。 我决定,能够停止播放剪辑可能是个好主意,所以我为每个列表视图项目添加了一个停止按钮,但将可见性设置为 GONE,直到播放某些内容。

代码:

        ImageButton bplay = (ImageButton) itemView.findViewById(R.id.item_bplay);
        bplay.setTag(currentClip.getFile());
        bplay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalItemView.findViewById(R.id.item_bplay).setVisibility(View.GONE);
                finalItemView.findViewById(R.id.item_bstop).setVisibility(View.VISIBLE);
                mp.release();
                mp = MediaPlayer.create(getApplicationContext(), currentClip.getFile());
                mp.start();
                mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        finalItemView.findViewById(R.id.item_bplay).setVisibility(View.VISIBLE);
                        finalItemView.findViewById(R.id.item_bstop).setVisibility(View.GONE);
                    }

                });
            }
        });

        ImageButton bstop = (ImageButton) itemView.findViewById(R.id.item_bstop);
        bstop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mp.release();
                finalItemView.findViewById(R.id.item_bplay).setVisibility(View.VISIBLE);
                finalItemView.findViewById(R.id.item_bstop).setVisibility(View.GONE);
            }
        });

说明:

只要用户只专注于一个剪辑,它就可以正常工作。播放按钮被停止按钮取代,停止按钮停止剪辑,或者如果您让剪辑用完,按钮也会切换回来。

问题:

如果用户决定通过点击列表中的第二个元素上的播放来中断播放,第一个元素将被停止按钮卡住。由于停止按钮只执行 mp.release(),所以第一个元素的停止按钮现在能够停止第二个剪辑的播放。 由于这一切都发生在列表视图中,因此当单击第二个项目时,我不再有权访问第一个以再次替换按钮。 我寻找一种方法来捕捉中断(很像 mp.setOnCompletionListener 寻找成功完成)并重置按钮,但到目前为止,我想不出任何东西。 实际上,我喜欢这样一个事实,即通过先发布,然后创建一个新的媒体播放器,然后启动它,用户只需在另一个剪辑上按播放即可在剪辑之间快速切换。我只是希望原始剪辑上的停止按钮在新剪辑开始后消失。

问题:

  • 当用户决定切换到另一个剪辑而不停止第一个剪辑时,我该如何捕捉?
  • 我切换按钮的方法是否有意义?有更好的选择吗?

【问题讨论】:

    标签: android android-listview android-mediaplayer


    【解决方案1】:

    如果您创建了一个处理 MediaPlayer 的服务,您可以向它发送意图以控制播放/停止。在播放 Intent 中,您可以包含一个 PendingIntent,当当前正在播放的媒体因任何原因(完成或启动其他剪辑)停止时,服务会将该 PendingIntent 发送回 UI。

    PendingIntent 是由列表项的 onClick 回调生成的,所以它会自动调用正确的列表项回调并重置按钮。

    【讨论】:

    • 感谢您的回复。我会调查的。
    【解决方案2】:
    • 当用户决定切换到另一个剪辑而不停止第一个剪辑时,我该如何捕捉?

    我认为 setOnCompletionListener 可能是个好主意,但你应该调用 stop() 方法而不是 release()。如果它没有帮助你也可以跳过流到最后( seekTo(getDuration ()) 方法)。这肯定会调用 onCompletionListener

    • 我切换按钮的方法是否有意义?有更好的选择吗?

    我认为您不需要使用 ImageButton。添加到您的适配器“已选择”字段,您可以在其中记住最后选择的项目的编号。在 getView() 中,您可以检查某些行是否“选中”并显示适当的图像(播放/暂停)。然后将 OnItemClickListener 接口添加到您的 Adapter 类。调用 onItemClick 方法时,检查是否选择了相同的(然后暂停流并使“选定”字段为空)或新的(然后播放流并将新行号分配给“选定”字段)行。调用 notifyDataSetChanged() 方法以在列表视图中生成具有正确图像的新行。

    【讨论】:

    • OnCompletionListener 没有得到,当有另一个项目中断时,因为每个 Play 调用都以 mp.release() 开头,所以前一个 mp 实例被取消了。
    • 另外,我确实需要 ImageButton,因为这些项目由一个 textview 和自定义列表视图中的四个 ImageButtons 组成,如果单击列表项,我不只是希望播放该项目。我的问题的意思是:用同一个按钮替换一个按钮的可绘制对象和方法来切换播放和停止是否更容易,还是有一个单独的播放和停止按钮更有意义,但是通过可见和消失只在完全相同的位置向用户显示一个。
    • 对用户来说,这并没有什么不同,他们看到一个播放按钮,一旦他们点击它,在同一个地方就会有一个停止按钮,但是 Java 中的方法存在本质上的不同,这就是我问的原因。我不打算放弃用户已经习惯的整个布局。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多