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