Фрагмент onStop () не останавливает медиаплеер - PullRequest
0 голосов
/ 01 декабря 2018

Я пытался остановить воспроизведение моей песни при переходе от Fragmant A к Fragment B с использованием onStop(), но я не могу заставить его работать.

Это результат отладки: enter image description here

Моя переменная медиаплеера получает свойства песни, но пропускает оператор -> mediaplayer.isPlaying.

Когда я нахожусь внутри моего фрагмента B, он все еще продолжает воспроизводить песню.

Что я делаю не так?

ПРИМЕЧАНИЕ: я не играю свою музыку из моего фрагмента A (я просто добавляю песни сюда).Я играю песни с моего адаптера.Не знаю, может ли это быть так, но если это так -> тогда я не могу позвонить onStop() внутри моего адаптера.

РЕДАКТИРОВАНИЕ: Это мой класс адаптера:

public class ListViewAdapter extends BaseAdapter {

//Create variables
MediaPlayer mediaPlayer;
int layout;
Song currentSong;
ArrayList<Song> arrayList;
Context context;

//Constructor
public ListViewAdapter(int layout, ArrayList<Song> arrayList, Context context) {
    this.layout = layout;
    this.arrayList = arrayList;
    this.context = context;
}

//ViewHolder class holding my views
private class Viewholder {
    TextView artistTxt, songNameTxt;
    ImageView playB, stopB;
    CircleImageView artistImg;
}

@Override
public int getCount() {
    return arrayList.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View view, ViewGroup parent) {

    //Create viewholder variable
    final Viewholder viewholder;

    //Check if view is null
    if (view == null) {

        //Create new ViewHolder object
        viewholder = new Viewholder();

        //Inflate my view
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = layoutInflater.inflate(R.layout.listview_customlayout, null);

        //Find my view id's
        viewholder.artistImg = (CircleImageView) view.findViewById(R.id.artistImgBackgroundDetail);
        viewholder.artistTxt = (TextView) view.findViewById(R.id.artistTxt);
        viewholder.songNameTxt = (TextView) view.findViewById(R.id.songNameTxt);
        viewholder.playB = (ImageView) view.findViewById(R.id.playB);
        viewholder.stopB = (ImageView) view.findViewById(R.id.stopB);

        //Set my view to viewholder
        view.setTag(viewholder);
    } else {
        viewholder = (Viewholder) view.getTag();
    }

    //Assign song to my arraylist
    final Song song = arrayList.get(position);

    //Set my views to their resources
    viewholder.artistImg.setImageResource(song.getArtistImg());
    viewholder.artistTxt.setText(song.getArtist());
    viewholder.songNameTxt.setText(song.getSongName());

    //get all songs
    mediaPlayer = MediaPlayer.create(context, song.getSong());

    //Play button click performed
    viewholder.playB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            //Checks if my current song is null and creates a new song
            if (currentSong == null) {
                mediaPlayer = MediaPlayer.create(context, song.getSong());

            }

            //if mediaplayer is not null and my current song is not equal to the new song i clicked on
            if (mediaPlayer != null && currentSong != song) {

                //resets the mediaplayer and creates a new song from the position in the list
                mediaPlayer.reset();

                mediaPlayer = MediaPlayer.create(context, song.getSong());
                viewholder.playB.setImageResource(R.drawable.play_black);

                mediaPlayer.start();
                viewholder.playB.setImageResource(R.drawable.pause_black);
            } else {
                mediaPlayer.pause();
                viewholder.playB.setImageResource(R.drawable.play_black);
            }

            //check if current song is null or the newly clicked song is equal to my current song
            //if true then assign the newly clicked song as my CURRENT one
            //--so it doesnt play the same song for every single one
            if (currentSong == null || song != currentSong) {
                currentSong = song;
            }
        }
    });

    //Stop song when click performed
    viewholder.stopB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //stops my current song and make it null
            if (currentSong != null) {
                mediaPlayer.stop();
                mediaPlayer.release();

                currentSong = null;
                viewholder.playB.setImageResource(R.drawable.play_black);
            }
        }
    });

    return view;
}

}

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вы можете попытаться добавить метод, чтобы остановить медиаплеер в вашем адаптере:

public void stop() {
    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
        mediaPlayer.stop();
        mediaPlayer.release();
        mediaPlayer = null
    }
}

И вызвать метод, когда фрагмент останавливается:

@Override
public void onStop() {
    super.onStop();
    adapter.stop();
}
0 голосов
/ 01 декабря 2018
mediaPlayer = MediaPlayer.create(...)
.
.
.
mediaPlayer.stop()

Вы создаете нового игрока и затем останавливаете его.Ты никогда не остановишь того, кто уже играл.

...