关于Android ViewPager 与 Fragment 一起使用碰到的问题
2019獨角獸企業重金招聘Python工程師標準>>>
????這是我前段時間遇到的兩個問題,情況是這樣的:第一個問題:由于公司的 app 層級比較多,所以用了一個翻頁的功能。在具體翻到某一頁的時候,我們需要更新當前頁的完成時間,但是當我開發的時候發現翻到當前頁的時候也會更新下一頁的時間。通過調試,發現當我進入頁面的時候 Fragment 會執行兩次,相當于進入當前頁面后會預加載下一頁的內容。后來通過了解 Android 的 ViewPager 與 Fragment 發現系統會默認預加載功能,而且默認的數值是 2. 這讓我好像找到了解決的辦法,通過查找,我發現有一個方法 setOffscreenPageLimit(int?limit) 可以設置預加載的數量,當我調用此方法,給 limit 賦值為 0 時發現不起作用,后來看了一下 ViewPager 的源碼: private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES , 默認值是 1, 我們來看看 setOffscreenPageLimit(int?limit) 方法的源碼:
????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) 方法,就可以只更新當前頁的時間了。想法固然很好,但是新的問題又來了。
????問題之二:當我運行時總會出現空指針異常,通過調試,我發現更新時間代碼里面調用的 Fragment 成員變量值都為 null,難道翻頁時都會首先銷毀 Fragment,然后再重新 new 出一個對象?Android 似乎就是這么做的,所以,在調用 Fragment 里面實現的那個接口方法時,不應該調用 Fragment 對象里面的成員變量,解決方法之一是把要使用到的成員變量保存在用到?ViewPager 的 Activity 里面。方法之二:Fragment雖然有onResume和onPause的,但是這兩個方法是Activity的方法,調用時機也是與Activity相同,和ViewPager搭配使用這個方法就很雞肋了,根本不是你想要的效果,這里介紹一種方法:
????@Override??public?void?setUserVisibleHint(boolean?isVisibleToUser)?{??super.setUserVisibleHint(isVisibleToUser);??if?(isVisibleToUser)?{??//相當于Fragment的onResume??}?else?{??//相當于Fragment的onPause??}??}當 isVisibleToUser 這個參數為true時,說明這個Fragment已經在你的眼前了,這時你再去加載你需要的數據或者更新數據就可以了。
轉載于:https://my.oschina.net/u/1460984/blog/305240
總結
以上是生活随笔為你收集整理的关于Android ViewPager 与 Fragment 一起使用碰到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery添加/改变/移除CSS类
- 下一篇: spring MVC(2)--注解Hel