关于ViewPager预加载包含SurfaceView的问题

本人从事androidTV开发,做launcher时候用的ViewPager加载多个fragment.正常逻辑是fragment显示的时候才去播放视频,当预加载的fragment中含有SurfaceView并且fragment在生命周期方法中有调用播放方法的时候会导致播放.


解决方案

网上有很多说去设置预加载数量来解决,但是源码中有判断数量小于默认值就设置为1所以行不通.

    private static final int DEFAULT_OFFSCREEN_PAGES = 1;

    public void setOffscreenPageLimit(int limit) {  

        if (limit < DEFAULT_OFFSCREEN_PAGES) {  

        Log.w(TAG,"Requested offscreen page limit " + limit + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES);  

            limit = DEFAULT_OFFSCREEN_PAGES;  

        }  

        if (limit != mOffscreenPageLimit) {  

            mOffscreenPageLimit = limit;  

            populate();  

        }  

    }

还有通过自定义一个ViewPager,把源码copy过来,修改这个DEFAULT_OFFSCREEN_PAGES值为0,这样就不会预加载,但是效果很不好.

我想的解决方案是通过ViewPager的OnPageChangeListener,判断当前显示的fragment是否含有SurfaceView,再通过onPageScrollStateChanged(int state)

参数state(SCROLL_STATE_IDLE:什么都没做,SCROLL_STATE_DRAGGING:开始滑动,SCROLL_STATE_SETTLING:滑动结束)

控制视频播放.这样就可以达到预期的效果,预加载但不会去播放视频.

你可能感兴趣的:(关于ViewPager预加载包含SurfaceView的问题)