1. 程式人生 > >fragment 中使用 setUserVisibleHint 懶載入遇到的坑

fragment 中使用 setUserVisibleHint 懶載入遇到的坑

在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 中進行網路請求,是沒有任何影響的