Button btnPlayPause, btnNext, btnPrevious;
Bundle b;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_song);
btnPlayPause = (Button) findViewById(R.id.btnPlayPause);
btnNext = (Button) findViewById(R.id.btnNext);
btnPrevious = (Button) findViewById(R.id.btnPrevious);
Intent currSong = getIntent();
b = currSong.getExtras();
btnPlayPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
btnPlayPause.setText("Play");
} else {
mediaPlayer.start();
btnPlayPause.setText("Stop");
}
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
btnPlayPause.setText("Play");
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
btnNext.setOnClickListener(new View.OnClickListener() {
int songIndex = (int) b.get("songIndex");
@Override
public void onClick(View v) {
if (songIndex < songList.size() - 1) {
songIndex = songIndex + 1;
Toast.makeText(getApplicationContext(), "You Clicked " + songIndex , Toast.LENGTH_SHORT).show();
try {
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.setDataSource(songList.get(songIndex).getData());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}else{
songIndex=0;
}
}
});
btnPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (songIndex > 0){
songIndex = songIndex-1;
Toast.makeText(getApplicationContext(), "You Clicked " + songIndex , Toast.LENGTH_SHORT).show();
try {
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.setDataSource(songList.get(songIndex).getData());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}else {
songIndex = songList.size() - 1;
}
}
});
}
}
所以当我点击下一个按钮时,它会播放第二首歌曲,但是在我的歌曲列表的末尾,它会从[0]中存储的列表中跳过第一首歌曲,然后在第二次点击时会转到[1]所以那里总是有一首歌没有播放。 我怎样才能解决这个问题,还是有一种更方便的方式去下一首歌?
谢谢, -Vince
EDIT;
问题2;当我选择一首歌时,让我们说位置37,然后点击之前它会转到36,但如果我然后点击下一步就会转到38,所以它会跳过我先播放的歌曲。
编辑2; 好的问题仍然存在,但我发现,当我在之前的btn上点击几次时,让我说我从第25位开始并使用之前的btn转到15,然后当我再次点击下一步它再次从25开始计数我怎么解决这个问题?提前谢谢, - vince
答案 0 :(得分:0)
好的,你有几个问题:
我发现,当我在之前的btn上点击几次时,让我说我从第25位开始,然后用前一个btn转到15,当我再次点击下一步时,它才开始计数从25
在PlayNext的第一行中,您将songIndex重新分配给传递给活动的原始songIndex。 PlayPrevious使用另一个我无法看到定义位置的songIndex。如果您遵循Android指南始终使用“m”类别属性与局部变量作为前缀,那么您很容易意识到这一点。
所以当我点击下一个按钮时,它会播放第二首歌曲,但是在我的歌曲列表的末尾它会从[0]中存储的列表中跳过第一首歌曲,然后在第二次点击时会跳到[1]
用户在最后一首歌曲之后播放下一首歌曲的边缘情况,或者在第一首歌曲之后的前一首歌曲被错误编码。在这些情况下,您正确更新songIndex,但不要调用play。
除了问题之外,你应该做的是使用函数稍微修改你的代码,以避免重复功能。这总是容易出现这种错误。我建议这样的事情:
int mCurrentIndex; // always prefix class properties with an "m"
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_song);
Button btnPlayPause = (Button) findViewById(R.id.btnPlayPause),
btnNext = (Button) findViewById(R.id.btnNext),
btnPrevious = (Button) findViewById(R.id.btnPrevious);
Intent currSong = getIntent();
Bundle b = currSong.getExtras();
// load initial index only once
mCurrentIndex = (int) b.get("songIndex");
btnPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCurrentIndex = mCurrentIndex > 0 ? mCurrentIndex - 1 : mSongList.size() - 1;
playSongNumber(mCurrentIndex);
}
}
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCurrentIndex++;
mCurrentIndex %= mSongList.size();
playSongNumber(mCurrentIndex);
}
}
}
private void playSongNumber(int index) {
try {
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.setDataSource(mSongList.get(index).getData());
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
略显清洁,不是吗?