视频没有在片段 ViewPager 中暂停 [英] Video is not pausing in fragment ViewPager

查看:14
本文介绍了视频没有在片段 ViewPager 中暂停的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用带有片段的 View Pager 来显示图像和视频,我能够正确显示图像和视频,但我有问题,当我滑动视频时,视频正在播放,但我滑动下一个或上一个然后视频是仍在下一个或上一个屏幕上播放,但是当我将两张幻灯片移动到下一个或上一个时,视频正在停止,但为什么不在下一个或上一个幻灯片上播放.

I am using View Pager with fragment to showing image and video, I am able to show image and video properly but I have problem, when I swipe for video, then video is playing, but I swipe next or previous then video is still playing on just next or previous screen but when I move two slide next or previous then video is being stop, but why not on next or previous slide.

我搜索了更多但我没有得到任何解决方案,任何帮助都会很明显.提前致谢.

I search it more but I did not get any solution, any help will be appreciable. Thanks in advance.

这是我的代码:

这是片段类

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;
    }
}

这是寻呼机适配器活动

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());

            }
        }

}

推荐答案

这是因为 ViewPager 保持屏幕外片段启动.例如,您有一个对用户可见的片段.ViewPager 将尝试保持前一个片段(左侧)和下一个片段(右侧)的启动.这允许 ViewPager 在用户决定更改页面时执行平滑滑动,因为已经准备好下一页和上一页.

It is because ViewPager keeps offscreen fragments started. For instance you have a fragment visible to the user. ViewPager will try to keep the previous fragment (on the left side) and the next fragment (on the right side) started. This allows ViewPager performing smooth sliding when user decides to change the page, because the next and the previous pages are already prepared.

在您的情况下,视频播放器不可见(屏幕外),但由于上述行为,ViewPager 使其保持启动状态.您可以使用 setOffscreenPageLimit() 改变这种行为的方法.如果您将页面限制设置为 0,则屏幕外片段将立即暂停.不幸的是,它们不仅会被暂停,还会停止并脱离活动.这意味着当您返回片段时,它将重新创建整个布局.这就是为什么您可以尝试覆盖 Fragment.setUserVisibleHint()Fragment.onHiddenChanged() 并在那里执行暂停/播放逻辑的原因.ViewPager 将根据片段是否对用户实际可见来更新片段的隐藏状态.

In your case the video player is not visible (offscreen), but ViewPager keeps it started as due to the behaviour described above. You can use setOffscreenPageLimit() method to change this behaviour. If you set page limit to 0, then offscreen fragments will be paused immediately. Unfortunately they will not only be paused, but stopped and detached from the activity too. This means when you return back to your fragment, it will recreate the whole layout anew. That's why you can try to override either Fragment.setUserVisibleHint() or Fragment.onHiddenChanged() and execute your pause/play logic there. ViewPager will update hidden state of a fragment depending on whether the fragment is actually visible to user or not.

希望这会有所帮助.

这篇关于视频没有在片段 ViewPager 中暂停的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆