Java 如何更改OnClick Listener以停止当前声音并启动新的OnClick

Java 如何更改OnClick Listener以停止当前声音并启动新的OnClick,java,android,android-mediaplayer,Java,Android,Android Mediaplayer,你好,我现在正在Udacity做一个免费的课程来建立一个翻译应用程序。 还有一个任务,让ArrayList的ListItem在单击时播放声音。他们说你可以单独做,也可以和教程一起做。所以我自己做了,跳过了演示如何做的教程。 现在我带着我的工作代码回到教程。 然后他们给了我们另一个任务。在MediaPlayer停止播放后,使用OnStop方法释放资源。 但是我没有像他们在教程中那样完成前面的任务。现在我坚持完成新任务 我制作了一个自己的适配器“WordAdapter”,我有4个活动 在WordAd

你好,我现在正在Udacity做一个免费的课程来建立一个翻译应用程序。 还有一个任务,让ArrayList的ListItem在单击时播放声音。他们说你可以单独做,也可以和教程一起做。所以我自己做了,跳过了演示如何做的教程。 现在我带着我的工作代码回到教程。 然后他们给了我们另一个任务。在MediaPlayer停止播放后,使用OnStop方法释放资源。 但是我没有像他们在教程中那样完成前面的任务。现在我坚持完成新任务

我制作了一个自己的适配器“WordAdapter”,我有4个活动

在WordAdapter中,我创建了两个全局值:

私人媒体播放器播放; 私人互联网播放

在@OverrideMethod中 我将isPlaying的值设置为0

isPlaying = 0;
我创建了一个onclick监听器

private MediaPlayer.OnCompletionListener mOnCompletion = new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        isPlaying = 0;
        releaseMediaPlayer();
    }
};
我创建了一个ImageButton宽度的OnClickListener

    ImageButton playIcon = (ImageButton) listItemView.findViewById(R.id.playIcon);
        int colorOfThePlayIcon = ContextCompat.getColor(getContext(), mColorResourceId);
        playIcon.setBackgroundColor(colorOfThePlayIcon);
        playIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                play = MediaPlayer.create(getContext(), currentWord.getPlaySound());

                if (isPlaying == 1) {
                    play.stop();
                    play.reset();
                    play.create(getContext(), currentWord.getPlaySound());
                    play.start();
                    isPlaying = 1;

                }

                if (isPlaying == 0) {
                    play.start();
                    isPlaying = 1;
                }
                play.setOnCompletionListener(mOnCompletion);
            }
        });
然后我做了一个releaseMediaPlayerMethod:

public void releaseMediaPlayer() {
    if (play != null){
        play.release();
        play = null;
    }
}
在活动中,我制作了一个OnStop方法:

@Override
protected void onStop() {
    super.onStop();
    WordAdapter stopSoundAndReleasIt = new WordAdapter(this);
    stopSoundAndReleasIt.releaseMediaPlayer();
}
因此,这段代码应该在单词完成播放后释放MediaPlayer的资源。 当用户离开应用程序后活动停止时,也应该释放资源。 当我在MediaPlayer播放声音时单击播放图标时,它应该停止当前声音并开始播放新选定的声音。 如果我在MediaPlayer播放声音时离开应用程序,它应该先停止声音,然后释放资源

但如果我点击播放图标,应用程序不会停止当前声音并启动新声音。它只是播放两种声音。或者,如果我点击三次,就会听到三个声音

如果我离开应用程序,它也不会停止当前的声音


那么,我需要做什么来更改,使其停止当前的声音onClick呢?

我更改了onClick方法和releaseMediaPlayer方法中的代码。现在,如果我在播放图标上单击两次,播放的声音将停止,新的声音将开始

public void releaseMediaPlayer() {
    // If the media player is not null, then it may be currently playing a sound.
    if (play != null) {
        // Regardless of the current state of the media player, release its resources
        // because we no longer need it.
        play.release();
        // Set the media player back to null. For our code, we've decided that
        // setting the media player to null is an easy way to tell that the media player
        // is not configured to play an audio file at the moment.
        play = null;
        Log.e("WordAdapter.this", "onStop");
    }
}

playIcon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            releaseMediaPlayer();
            play = MediaPlayer.create(getContext(), currentWord.getPlaySound());
            play.start();
            play.setOnCompletionListener(mOnCompletion);
        }
    });
现在唯一的问题是,如果我点击home按钮,它不会调用'releaseMediaPlayer(…)'方法。而且实际的声音不会停止播放

在WordAdapter中,我有以下代码。我可以在活动中调用releaseMediaPlayer方法

public WordAdapter(Context context) {
    super(context, 0, 0);
}
编辑:我现在遇到了真正的问题,releaseMediaPlayer方法被称为应该如何,但是

if(play != null) {}

当我从活动中调用它时,它总是错误的。但是我不知道为什么。

我认为您应该在
onClick(…)
方法之外创建媒体播放器。现在,您总是在新创建的
MediaPlayer
实例上调用
stop()
release()
,谢谢您的回答。但是如果我从
onClick(…)
方法中取出
.create
,当我点击播放图标时,应用程序停止工作。我认为如果声音没有播放,则不会调用
stop()
方法,因为。创建应用程序时,通过onCompletion方法将iPlay值设置为0。