视频不是片段暂停ViewPager [英] Video is not pausing in fragment ViewPager

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

问题描述

我使用的查看传呼机与片段显示图像和视频,我能够正确显示图像和视频,但我有问题,当我刷卡的视频,然后在播放视频,但我刷下一个或previous那么视频仍然在播放上毗邻或previous屏幕,但是当我移动两个滑动下一个或previous则视频正在被停止,但为什么不能在明年或previous幻灯片。

我更多的搜索,但我没有得到任何的解决方案,任何帮助将AP preciable。 先谢谢了。

下面是我的code:

这是片段类

 公共类ContentFragment扩展片段{
    私人最终字符串imageResourceId;
    私人字符串类型;


    公共ContentFragment(字符串imageResourceId,字符串类型){
        的System.out.println(路径在利弊=+ imageResourceId +和类型=+型);
        this.imageResourceId = imageResourceId;
        this.type =类型;
    }


    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.e(测试,你好);
    }

    @覆盖
    公共无效onActivityCreated(包savedInstanceState){
        super.onActivityCreated(savedInstanceState);

    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
        捆绑savedInstanceState){

        查看查看= inflater.inflate(R.layout.content_layout,集装箱,假);

        TouchImageView ImageView的=(TouchImageView)view.findViewById(R.id.touchImage);
        imageView.setImageResource(R.id.touchImage);
        imageView.setMaxZoom(10F);
        VideoView videoView =(VideoView)view.findViewById(R.id.videoView1);

        如果(type.equals(图像)){
            imageView.invalidate();

            imageView.setVisibility(View.VISIBLE);
            videoView.setVisibility(View.GONE);

            尝试 {
                的System.out.println(内容片断+ imageResourceId.toString());

                BMP位= BitmapFactory.de codeFILE(imageResourceId.toString());
                imageView.setImageBitmap(BMP);

            }赶上(例外五){
                的System.out.println(+ E图像文件的错误);
            }


        } 其他
        尝试 {
        如果(type.equals(视频)){
            videoView.invalidate();
            videoView.setVisibility(View.VISIBLE);
            imageView.setVisibility(View.GONE);

            字符串路径= imageResourceId.toString();
            videoView.setVideoURI(Uri.parse(路径));
                videoView.setMediaController(新的MediaController(getActivity()));
                videoView.setFocusable(真正的);
                videoView.start();
            }
        }赶上(例外五){
        e.printStackTrace();
        }

        返回查看;
    }
}
 

这是寻呼机适配器活动

 公共类MediaActivity扩展FragmentActivity {

     私人MyAdapter mAdapter;
        私人ViewPager mPager;


       公众的ArrayList<内容> contentList;
     上下文语境;
        的LinearLayout numberOfPageLayout;
     共享preferences共享preferences;
     处理器progressHandler;
        / **第一次创建活动时调用。 * /
        @覆盖
        公共无效的onCreate(包savedInstanceState){
            super.onCreate(savedInstanceState);
            的setContentView(R.layout.activity_media);
            上下文=(上下文)getApplicationContext();
                    mPager =(ViewPager)findViewById(R.id.pager);
            progressHandler =新的处理程序();
            contentList =新的ArrayList<内容>();
                新的AsyncTask<虚空,虚空,虚空>(){

                    @覆盖
                    保护无效doInBackground(虚空...... PARAMS){
                        // TODO自动生成方法存根
                        contentList =新ContentDBAdapter(上下文).getAllContent();

                        }
                        返回null;
                    }
                    @覆盖
                    保护无效onPostExecute(无效的结果){
                        // TODO自动生成方法存根
                        super.onPostExecute(结果);
                        mAdapter =新MyAdapter(getSupportFragmentManager(),contentList);
                        mPager.setAdapter(mAdapter);
                    }
                }。执行();




            mPager.setOnPageChangeListener(新OnPageChangeListener(){

                @覆盖
                公共无效onPageSelected(INT为arg0){
                    // TODO自动生成方法存根

                }

                @覆盖
                公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){
                    // TODO自动生成方法存根


                }

                @覆盖
                公共无效onPageScrollStateChanged(INT为arg0){
                    // TODO自动生成方法存根

                }
            });
        }


        公共静态类MyAdapter扩展FragmentPagerAdapter {
            ArrayList的<内容> contList =新的ArrayList<内容>();
            公共MyAdapter(FragmentManager FM,ArrayList的<内容>续){
                超(FM);
                this.contList = CONT;
            }

            @覆盖
            公众诠释getCount将(){
                共页= contList.size();
                返回contList.size();
            }

            @覆盖
            公共片段的getItem(INT位置){

                内容CON = contList.get(位置);

                返回新ContentFragment(co​​n.getPath(),con.getType());

            }
        }

}
 

解决方案

这是因为 ViewPager 不断屏幕之外片段开始。例如有对用户可见的片段。 ViewPager 将尽量保持previous片段(左侧)和下一个片段(右侧)开始。这使得 ViewPager 执行顺利,当用户决定改变页面滑动,因为旁边和previous页面已经prepared。

在你的情况下,视频播放器是不可见的,但 ViewPager 保持它在缓存中。您可以通过<一个控制这个缓存的大小href="http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit%28int%29">setOffscreenPageLimit()方法。如果你将其设置为 0 无形的片段将被立即暂停。不幸的是,他们不仅会被暂停,但停了下来,从活动的分离。这意味着当您返回到您的片段,它会重建整个布局重新。这就是为什么你可以尝试重写或者 Fragment.setUserVisibleHint() Fragment.onHiddenChanged()键,暂停/播放视频那里。 ViewPager 将更新取决于片段的隐藏状态的片段是否是可见的用户与否。

希望这有助于。

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.

Here is my code:

This is 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 pager adapter activity

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

            }
        }

}

解决方案

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

In your case video player is not visible, but ViewPager keeps it in cache. You can control size of this cache via setOffscreenPageLimit() method. If you set it to 0 invisible fragments will be paused immediately. Unfortunately they will not only be paused, but stopped and detached from activity. This means when you return back to your fragment, it will recreate whole layout anew. That's why you can try to override either Fragment.setUserVisibleHint() or Fragment.onHiddenChanged() and pause/play your video there. ViewPager will update hidden state of a fragment depending on whether the fragment is visible to user or not.

Hope this helps.

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

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