我有一个Fragment
,其中ListView
是一个声音列表,以这种方式填充:
MediaPlayer mMediaPlayer;
listview.setAdapter(new ListAdapter(getActivity(), tit, desc, songs, filenames, mMediaPlayer));
MediaPlayer是作为参数给出的,因为我希望当按下后退按钮或应用程序进入后台时,播放器将停止播放。 所以我在我的片段中覆盖onPause和onDestroy方法,但这不起作用。即使应用关闭,声音也会继续播放。这是我的代码:
@Override
public void onDestroy() {
// TODO Auto-generated method stub
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
super.onDestroy();
}
@Override
public void onPause() {
// TODO Auto-generated method stub
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
super.onPause();
}
我在BaseAdapter
课堂上播放声音,这样:
public void playSound2(int pos){
if(isPlaying){
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
isPlaying = false;
}
mMediaPlayer = MediaPlayer.create(context, songs[pos]);
mMediaPlayer.start();
isPlaying = true;
}
你有什么建议吗?谢谢。
答案 0 :(得分:2)
我的第一个建议是:不要使用适配器与媒体播放器进行交互。而是将项目点击监听器附加到列表视图,如此
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
...
}});
并在onItemClick
回调中对媒体播放器执行任何操作。
话虽这么说,你应该在你的onclicklistener内部重置你的媒体播放器,如此
try {
mPlayer.reset();
mPlayer.setDataSource(trackToBePlayed); //trackToBePlayed is dependent on the select position
mPlayer.setOnPreparedListener(mPreparedListener);
mPlayer.prepareAsync();
} catch (IOException e) {
} catch(IllegalArgumentException e) {
}
在mPreparedListener中,准备就绪后,
mPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
};
这足以指出你正确的方向:)