關於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:滑動結束)
控制視訊播放.這樣就可以達到預期的效果,預載入但不會去播放視訊.