關於Android ViewPager 與 Fragment 一塊兒使用碰到的問題

    這是我前段時間遇到的兩個問題,狀況是這樣的:第一個問題:因爲公司的 app 層級比較多,因此用了一個翻頁的功能。在具體翻到某一頁的時候,咱們須要更新當前頁的完成時間,可是當我開發的時候發現翻到當前頁的時候也會更新下一頁的時間。經過調試,發現當我進入頁面的時候 Fragment 會執行兩次,至關於進入當前頁面後會預加載下一頁的內容。後來經過了解 Android 的 ViewPager 與 Fragment 發現系統會默認預加載功能,並且默認的數值是 2. 這讓我好像找到了解決的辦法,經過查找,我發現有一個方法 setOffscreenPageLimit(int limit) 能夠設置預加載的數量,當我調用此方法,給 limit 賦值爲 0 時發現不起做用,後來看了一下 ViewPager 的源碼: private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES , 默認值是 1, 咱們來看看 setOffscreenPageLimit(int limit) 方法的源碼:java

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

    在打印日誌裏面的語句就能夠看到,若是 limit 小於默認值 1,limit 的值仍是被設置成了 1,因此至關於系統老是會默認預加載下一頁的內容,這樣要取消預加載這個方法怎麼都無論用了。彷佛惟一的解決辦法是修改源碼的DEFAULT_OFFSCREEN_PAGES 值爲 0,而後再從新打包放到本身的項目中。這樣當然能夠解決問題,但是是否還有其它的解決辦法?我是這樣的解決的:在 Fragment 裏面實現一個接口,而後在 ViewPager 裏面註冊 setOnPageChangeListener 事件,在事件的 onPageSelected(int arg0) 方法裏面添加更新時間的代碼,這樣當翻頁時就會調用註冊事件裏面的 onPageSelected(int arg0) 方法,就能夠只更新當前頁的時間了。想法當然很好,可是新的問題又來了。app

    問題之二:當我運行時總會出現空指針異常,經過調試,我發現更新時間代碼裏面調用的 Fragment 成員變量值都爲 null,難道翻頁時都會首先銷燬 Fragment,而後再從新 new 出一個對象?Android 彷佛就是這麼作的,因此,在調用 Fragment 裏面實現的那個接口方法時,不該該調用 Fragment 對象裏面的成員變量,解決方法之一是把要使用到的成員變量保存在用到 ViewPager 的 Activity 裏面。方法之二:Fragment雖然有onResume和onPause的,可是這兩個方法是Activity的方法,調用時機也是與Activity相同,和ViewPager搭配使用這個方法就很雞肋了,根本不是你想要的效果,這裏介紹一種方法:ide

    @Override  
    public void setUserVisibleHint(boolean isVisibleToUser) {  
        super.setUserVisibleHint(isVisibleToUser);  
        if (isVisibleToUser) {  
            //至關於Fragment的onResume  
        } else {  
            //至關於Fragment的onPause  
        }  
    }


當 isVisibleToUser 這個參數爲true時,說明這個Fragment已經在你的眼前了,這時你再去加載你須要的數據或者更新數據就能夠了。spa

相關文章
相關標籤/搜索