Video does not pause in ViewPager fragment

I use View Pager with a snippet to display the image and video, I can display the image and video correctly, but I have a problem when I sit down for the video, then the video plays, but I scroll through the next or previous, then the videos are still playing on the next or the previous screen, but when I move two slides side by side or earlier, the video stops, but why not on the next or previous slide.

I am looking for him more, but I had no solution, any help would be noticeable. Thanks in advance.

Here is my code:

This is a fragment class.

public class ContentFragment extends Fragment { private final String imageResourceId; private String type; public ContentFragment(String imageResourceId,String type) { System.out.println("Path In cons="+imageResourceId+"and type is="+type); this.imageResourceId = imageResourceId; this.type= type; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("Test", "hello"); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.content_layout, container, false); TouchImageView imageView = (TouchImageView) view.findViewById(R.id.touchImage); imageView.setImageResource(R.id.touchImage); imageView.setMaxZoom(10f); VideoView videoView =(VideoView) view.findViewById(R.id.videoView1); if(type.equals("image")) { imageView.invalidate(); imageView.setVisibility(View.VISIBLE); videoView.setVisibility(View.GONE); try { System.out.println("IN Content Fragment"+imageResourceId.toString()); Bitmap bmp = BitmapFactory.decodeFile(imageResourceId.toString()); imageView.setImageBitmap(bmp); } catch(Exception e) { System.out.println("Error Of image File"+e); } } else try { if(type.equals("video")){ videoView.invalidate(); videoView.setVisibility(View.VISIBLE); imageView.setVisibility(View.GONE); String path = imageResourceId.toString(); videoView.setVideoURI(Uri.parse(path)); videoView.setMediaController(new MediaController(getActivity())); videoView.setFocusable(true); videoView.start(); } } catch(Exception e) { e.printStackTrace(); } return view; } } 

This is the activity of the pager adapter

 public class MediaActivity extends FragmentActivity { private MyAdapter mAdapter; private ViewPager mPager; public ArrayList<Content> contentList; Context context; LinearLayout numberOfPageLayout; SharedPreferences sharedPreferences; Handler progressHandler; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_media); context=(Context) getApplicationContext(); mPager = (ViewPager) findViewById(R.id.pager); progressHandler = new Handler(); contentList=new ArrayList<Content>(); new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub contentList=new ContentDBAdapter(context).getAllContent(); } return null; } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); mAdapter = new MyAdapter(getSupportFragmentManager(),contentList); mPager.setAdapter(mAdapter); } }.execute(); mPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } public static class MyAdapter extends FragmentPagerAdapter { ArrayList <Content>contList=new ArrayList<Content>(); public MyAdapter(FragmentManager fm,ArrayList<Content> cont) { super(fm); this.contList=cont; } @Override public int getCount() { totalPage=contList.size(); return contList.size(); } @Override public Fragment getItem(int position) { Content con=contList.get(position); return new ContentFragment(con.getPath(),con.getType()); } } } 
+7
android android-viewpager videoview fragment imageview
source share
2 answers

This is because ViewPager launches a screen saver. For example, you have a fragment visible to the user. ViewPager will try to save the previous fragment (left) and start the next fragment (right). This allows ViewPager to glide smoothly when the user decides to change the page because the next and previous pages are already prepared.

In your case, the video player is not displayed (behind the scenes), but the ViewPager saves it as a result of the behavior described above. You can use setOffscreenPageLimit () to change this behavior. If you set the page limit to 0 , then the fragment fragments will be temporarily suspended. Unfortunately, they will not only be suspended, but also stopped and suspended from activity. This means that when you return to the fragment, it will recreate the entire layout. Therefore, you can try to override either Fragment.setUserVisibleHint() or Fragment.onHiddenChanged() and execute your pause / play logic. ViewPager will update the hidden state of the fragment depending on whether this fragment is actually displayed to the user or not.

Hope this helps.

+9
source share

You need to override the setUserVisibleHint method in the fragment where u plays the video.

 public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (this.isVisible()) { if (!isVisibleToUser) // If we are becoming invisible, then... { //pause or stop video } if (isVisibleToUser) { //play your video } } } 
+4
source share

All Articles