Stop Audio in fragment when changing fragment with ViewPager

0

I have an activity called EstacionesF, where with has a ViewPager. in the ViewPager there are 12 fragments and in each fragment it contains audio, when I execute the play button and change to the next fragment, it is still heard, it only stops playing when I move two fragments andelante. this is my code

Fragment Station_1

public class EstacionF_1 extends Fragment {


private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private Button btn_Play_Pause;
private Button btnAudio_2;
private SeekBar seekBar;
private TextView textViewTmierL;
private TextView textViewTmierR;
private MediaPlayer mP_AudioGuia;
private int mediaFileLength;
private int realTimeLength;
private double startTime = 0;
private double finalTime = 0;
public static int oneTimeOnly = 0;
private Runnable runnable;
static boolean visible = false;

private String title;
private int page;

final Handler handler = new Handler();

private View.OnClickListener botones;

private OnFragmentInteractionListener mListener;

public EstacionF_1() {

}

public static EstacionF_1 newInstance(int page, String title) {
    EstacionF_1 fragment = new EstacionF_1();
    Bundle args = new Bundle();
    args.putInt("Holis 1", page);
    args.putString("Titulo", title);
    fragment.setArguments(args);
    return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    page = getArguments().getInt("SomeInt", 0);
    title = getArguments().getString("someTitle");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

   View view = inflater.inflate(R.layout.fragment_estacion_f_1, container, false);

    botones = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId())
            {

                case R.id.button_audiolibro:
                    Toast.makeText(getActivity(), "Proximamente", Toast.LENGTH_SHORT).show();

                    break;

                case R.id.btn_play_pause_Id:
                    seekBar.setMax(mP_AudioGuia.getDuration());
                    if(mP_AudioGuia.isPlaying()){
                        mP_AudioGuia.pause();
                        playCycle();
                        btn_Play_Pause.setBackgroundResource(R.drawable.ic_btnplay);
                    }else {mP_AudioGuia.start();
                        playCycle();
                        btn_Play_Pause.setBackgroundResource(R.drawable.ic_btnpausa);

                    }

                    break;
            }
        }
    };



    btn_Play_Pause  = (Button) view.findViewById(R.id.btn_play_pause_Id);
    btnAudio_2  = (Button) view.findViewById(R.id.button_audiolibro);
    seekBar = (SeekBar) view.findViewById(R.id.seekBar_Id);
    textViewTmierL = (TextView) view.findViewById(R.id.textTimer_IdL);
    textViewTmierR = (TextView) view.findViewById(R.id.textTimer_IdR);
    mP_AudioGuia = MediaPlayer.create(getActivity(), R.raw.station_1);
    btn_Play_Pause.setOnClickListener(botones);
    btnAudio_2.setOnClickListener(botones);

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean input) {
            if (input){
                mP_AudioGuia.seekTo(progress);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    return view;
}


public void playCycle(){
    seekBar.setProgress(mP_AudioGuia.getCurrentPosition());

    if(mP_AudioGuia.isPlaying()){
        runnable = new Runnable() {
            @Override
            public void run() {
                playCycle();

            }

        };
        handler.postDelayed(runnable, 1000);
    } else {
        btn_Play_Pause.setBackgroundResource(R.drawable.ic_btnplay);

    }

}

public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

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

}

@Override
public void onPause() {
    super.onPause();
    mP_AudioGuia.pause();
        }

@Override
public void onDestroy() {
    super.onDestroy();
    mP_AudioGuia.release();
    handler.removeCallbacks(runnable);
}

@Override
public void onStop() {
    super.onStop();
    mP_AudioGuia.stop();
    mP_AudioGuia.release();

}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}

}

Actiivity StationsF

    public class EstacionesF extends AppCompatActivity implements
    View.OnClickListener,
    EstacionF_1.OnFragmentInteractionListener,
    EstacionF_2.OnFragmentInteractionListener,
    EstacionF_3.OnFragmentInteractionListener,
    EstacionF_4.OnFragmentInteractionListener,
    EstacionF_5.OnFragmentInteractionListener,
    EstacionF_6.OnFragmentInteractionListener,
    EstacionF_7.OnFragmentInteractionListener,
    EstacionF_8.OnFragmentInteractionListener,
    EstacionF_9.OnFragmentInteractionListener,
    EstacionF_10.OnFragmentInteractionListener,
    EstacionF_11.OnFragmentInteractionListener,
    EstacionF_12.OnFragmentInteractionListener
{
SmartFragmentStatePagerAdapter adapterViewPager;
private ViewPager vpPager;
private Button btnPrev;
private Button btnNext;
private Button btnhome;
View.OnClickListener botones;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_estaciones_f);

    // Inicializando
    btnPrev  = (Button) findViewById(R.id.btn_prev_IdF);
    btnNext = (Button) findViewById(R.id.btn_next_IdF);
    btnhome  = (Button) findViewById(R.id.home_IdF);
    vpPager = (ViewPager) findViewById(R.id.vpPager);

    vpPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
    vpPager.setCurrentItem(getIntent().getExtras().getInt("position", 0));
    vpPager.setPageTransformer(true, new CubeOutTransformer());
    btnPrev.setOnClickListener(this);
    btnNext.setOnClickListener(this);
    btnhome.setOnClickListener(this);


}

@Override
public void onFragmentInteraction(Uri uri) {

}

@Override
public void onClick(View view) {

    switch (view.getId()){
        case R.id.btn_prev_IdF:
            vpPager.setCurrentItem(vpPager.getCurrentItem()-1);
            break;
        case R.id.btn_next_IdF:
            vpPager.setCurrentItem(vpPager.getCurrentItem()+1);
            break;
        case R.id.home_IdF:
            Intent home = new Intent(this, MainActivity.class);
            startActivity(home);
            break;
    }

}

public static class MyPagerAdapter extends SmartFragmentStatePagerAdapter
{
    private static int NUM_ITEMS = 12;

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position)
    {
        switch (position)
        {
            case 0:
                return EstacionF_1.newInstance(0, "Pagina 1");
            case 1:
                return EstacionF_2.newInstance(1, "Pagina 2");
            case 2:
                return EstacionF_3.newInstance(2, "Pagina 3");
            case 3:
                return EstacionF_4.newInstance(3, "Pagina 4");
            case 4:
                return EstacionF_5.newInstance(4, "Pagina 5");
            case 5:
                return EstacionF_6.newInstance(5, "Pagina 6");
            case 6:
                return EstacionF_7.newInstance(6, "Pagina 7");
            case 7:
                return EstacionF_8.newInstance(7, "Pagina 8");
            case 8:
                return EstacionF_9.newInstance(8, "Pagina 9");
            case 9:
                return EstacionF_10.newInstance(9, "Pagina 10");
            case 10:
                return EstacionF_11.newInstance(10, "Pagina 11");
            case 11:
                return EstacionF_12.newInstance(11, "Pagina 12");
            default:
                return null;
        }

    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "Page " + position;
    }

}

public void setViewPager (int fragmentNumber)
{
    vpPager.setCurrentItem(fragmentNumber);
}
}

SmartFragmentStatePagerAdapter

public  abstract class SmartFragmentStatePagerAdapter extends 
FragmentStatePagerAdapter{
// Sparse array to keep track of registered fragments in memory

private SparseArray<Fragment> registeredFragments = new SparseArray<>();

public SmartFragmentStatePagerAdapter(FragmentManager fm) {
    super(fm);
}

// Register the fragment when the item is instantiated

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, 
    position);
    registeredFragments.put(position, fragment);

    return fragment;
}
// Unregister when the item is inactive
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    registeredFragments.remove(position);
    super.destroyItem(container, position, object);
}

public Fragment getRegisteredFragment(int position) {
    return registeredFragments.get(position);
}

}
    
asked by Nestor Reyes 20.08.2017 в 17:40
source

1 answer

0

Try to limit the offset of the viewPager to 1 so that it destroys the previous fragment each time you switch between fragments:

vpPager.setOffscreenPageLimit(1);
    
answered by 21.08.2017 в 11:34