How to stop media player sound in view pager?

252 Views Asked by At

I am new to Android development and I have slider fragments in my activity. I am trying to play different sounds for different sliders. However, when I slide from one page to another page, the sounds are overlapping. Can anyone help us? Here's my code:

public class Diabetes1 extends Fragment {
       MediaPlayer mp;
       View rootView;

       @Override
       public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                         Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.slidertopimagecardlayout, container, false);
            SharedPreferences prefs = this.getActivity().getSharedPreferences("MY_LANGUAGE", MODE_PRIVATE);
            if (prefs.getString("myLanguage", "").equals("en")) {
                mp = MediaPlayer.create(getActivity().getBaseContext(), getResources().getIdentifier("diab1en", "raw", this.getActivity().getPackageName()));
                mp.start();
            } else if (prefs.getString("myLanguage", "").equals("es")) {
                mp = MediaPlayer.create(getActivity().getBaseContext(), getResources().getIdentifier("diab1en", "raw", this.getActivity().getPackageName()));
                mp.start();
            }
            return rootView;
       }

       @Override
       public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            // Make sure that we are currently visible
            if (this.isVisible()) {
                // If we are becoming invisible, then...
                if (!isVisibleToUser) {
                    mp.stop();
                } else {
                    // do what you like
                }
            }
       }

       @Override
       public void onPause() {
            super.onPause();
            if(mp.isPlaying()) {
                  mp.stop();
            }
       }

       @Override
       public void onResume() {
            super.onResume();
       }
}


2

There are 2 best solutions below

0
M.ekici On

Viewpager doesn't work appropriately for your purpose because it creates offscreen fragments for fast transition between pages. For your problem onCreateView is called for each but onPause isn't. To handle this you can use pageChangeListener with your pagerAdapter. After each page change you can switch to another sound and stop the current one. To do this you have to extract your media player logic from your page fragments.

1
Justin On

try this code and see if it works

public class Diabetes1 extends Fragment {
       MediaPlayer mp;
       View rootView;
       Boolean isPLaying = false;

       @Override
       public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                         Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.slidertopimagecardlayout, container, false);
            SharedPreferences prefs = this.getActivity().getSharedPreferences("MY_LANGUAGE", MODE_PRIVATE);
            if (prefs.getString("myLanguage", "").equals("en")) {
                mp = MediaPlayer.create(getActivity().getBaseContext(), getResources().getIdentifier("diab1en", "raw", this.getActivity().getPackageName()));
                mp.start();
                isPLaying = true;
            } else if (prefs.getString("myLanguage", "").equals("es")) {
                mp = MediaPlayer.create(getActivity().getBaseContext(), getResources().getIdentifier("diab1en", "raw", this.getActivity().getPackageName()));
                mp.start();
                isPLaying = true;
            }
            return rootView;
       }

       @Override
       public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            // Make sure that we are currently visible
            if (this.isVisible()) {
                // If we are becoming invisible, then...
                if (!isVisibleToUser) {
                    mp.stop();
                } else {
                    // do what you like
                }
            }
       }

       @Override
       public void onPause() {
            super.onPause();
            if(isPlaying) {
                  mp.stop();
                  isPLaying = false;
            }
       }

       @Override
       public void onResume() {
            super.onResume();
       }
}