fragment 中使用 setUserVisibleHint 懶載入遇到的坑
阿新 • • 發佈:2019-01-31
在viewpager + fragment 聯合使用時,利用setUserVisibleHint進行懶載入時,發現並不適用於view的操作。。。因為setUserVisibleHint是早於oncreateview之前執行的,所以會報空指標,用一段程式碼演示一下
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); Log.e("EEEEE","setUserVisibleHint++isVisibleToUser"+isVisibleToUser); if (getUserVisibleHint()){//此處不能用isVisibleToUser進行判斷,因為setUserVisibleHint會執行多次,而getUserVisibleHint才是判斷真正是否可見的 Log.e("EEEEE","setUserVisibleHint++getUserVisibleHint"+getUserVisibleHint()); mDiscoveryRadioGroup.clearCheck(); initListener(); if(isPlayMate){ mGirls.setChecked(true); isPlayMate = false; }else { mDiscovery.setChecked(true); } } }
我在onCreateView 的時候也打了一段Log,但是最後輸出的log是這樣的
09-11 22:37:09.628 8903-8903/com.gogosu.gogosuandroid E/EEEEE: setUserVisibleHint++isVisibleToUserfalse 09-11 22:37:09.628 8903-8903/com.gogosu.gogosuandroid E/EEEEE: setUserVisibleHint++isVisibleToUsertrue 09-11 22:37:09.628 8903-8903/com.gogosu.gogosuandroid E/EEEEE: setUserVisibleHint++getUserVisibleHinttrue
很明顯,setUserVisibleHint這個方法執行了3次,而Fragment的onCreateView還沒有執行就已經報錯退出了,所以我們不能在setUserVisibleHint中對UI進行操作。。。有一個比較次的解決方法,就是增加viewpager的快取個數,當viewpager進行快取時,fragment還沒有出現時就已經執行了onCreateview方法,此時,再選中某個fragment時會執行
setUserVisibleHint,並且 getUserVisibleHint是true所以就可以對UI進行操作了。。。
如果只是在
setUserVisibleHint 中進行網路請求,是沒有任何影響的