日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

关于Android ViewPager 与 Fragment 一起使用碰到的问题

發(fā)布時間:2024/9/20 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Android ViewPager 与 Fragment 一起使用碰到的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

????這是我前段時間遇到的兩個問題,情況是這樣的:第一個問題:由于公司的 app 層級比較多,所以用了一個翻頁的功能。在具體翻到某一頁的時候,我們需要更新當前頁的完成時間,但是當我開發(fā)的時候發(fā)現(xiàn)翻到當前頁的時候也會更新下一頁的時間。通過調(diào)試,發(fā)現(xiàn)當我進入頁面的時候 Fragment 會執(zhí)行兩次,相當于進入當前頁面后會預加載下一頁的內(nèi)容。后來通過了解 Android 的 ViewPager 與 Fragment 發(fā)現(xiàn)系統(tǒng)會默認預加載功能,而且默認的數(shù)值是 2. 這讓我好像找到了解決的辦法,通過查找,我發(fā)現(xiàn)有一個方法 setOffscreenPageLimit(int?limit) 可以設置預加載的數(shù)量,當我調(diào)用此方法,給 limit 賦值為 0 時發(fā)現(xiàn)不起作用,后來看了一下 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,所以相當于系統(tǒng)總是會默認預加載下一頁的內(nèi)容,這樣要取消預加載這個方法怎么都不管用了。似乎唯一的解決辦法是修改源碼的DEFAULT_OFFSCREEN_PAGES 值為 0,然后再重新打包放到自己的項目中。這樣固然可以解決問題,可是是否還有其它的解決辦法?我是這樣的解決的:在 Fragment 里面實現(xiàn)一個接口,然后在 ViewPager 里面注冊 setOnPageChangeListener 事件,在事件的 onPageSelected(int arg0) 方法里面添加更新時間的代碼,這樣當翻頁時就會調(diào)用注冊事件里面的 onPageSelected(int arg0) 方法,就可以只更新當前頁的時間了。想法固然很好,但是新的問題又來了。

????問題之二:當我運行時總會出現(xiàn)空指針異常,通過調(diào)試,我發(fā)現(xiàn)更新時間代碼里面調(diào)用的 Fragment 成員變量值都為 null,難道翻頁時都會首先銷毀 Fragment,然后再重新 new 出一個對象?Android 似乎就是這么做的,所以,在調(diào)用 Fragment 里面實現(xiàn)的那個接口方法時,不應該調(diào)用 Fragment 對象里面的成員變量,解決方法之一是把要使用到的成員變量保存在用到?ViewPager 的 Activity 里面。方法之二:Fragment雖然有onResume和onPause的,但是這兩個方法是Activity的方法,調(diào)用時機也是與Activity相同,和ViewPager搭配使用這個方法就很雞肋了,根本不是你想要的效果,這里介紹一種方法:

????@Override??public?void?setUserVisibleHint(boolean?isVisibleToUser)?{??super.setUserVisibleHint(isVisibleToUser);??if?(isVisibleToUser)?{??//相當于Fragment的onResume??}?else?{??//相當于Fragment的onPause??}??}


當 isVisibleToUser 這個參數(shù)為true時,說明這個Fragment已經(jīng)在你的眼前了,這時你再去加載你需要的數(shù)據(jù)或者更新數(shù)據(jù)就可以了。


轉(zhuǎn)載于:https://my.oschina.net/u/1460984/blog/305240

總結

以上是生活随笔為你收集整理的关于Android ViewPager 与 Fragment 一起使用碰到的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。