Fragmentation如何兼容新版本的setMaxLifecycle

看這篇文章前锁摔,大家應(yīng)該先對(duì)setMaxLifecycle有所了解庇谆。

本文基于 https://github.com/JantHsueh/Fragmentation 維護(hù)的1.0.5進(jìn)行修改,1.0.6后續(xù)會(huì)補(bǔ)上

上年年末,谷歌為新版本的Fragment添加了控制其在ViewPager中的生命周期的新方式——setMaxLifecycle(而ViewPager2中默認(rèn)且只有這個(gè)方式)蓬网。

ViewPager1中FragmentPagerAdapter的代碼

聽說后面還要把onActivityCreated砍了螟碎,注意下诞丽。

setMaxLifecycle的添加鲸拥,簡(jiǎn)化了ViewPager在切換對(duì)Fragment可見性判斷的復(fù)雜度,但是也增加了一些操X的問題:如果你使用了ViewPagersetMaxLifecycle僧免。因?yàn)樯芷诟淖兞诵谈希愕某绦蚩赡芤龀鱿鄳?yīng)的適配。
如果剛好你在用Fragmentation懂衩,又碰上了ViewPagersetMaxLifecycle撞叨,那么你就會(huì)發(fā)現(xiàn)只要打開了ViewPager所屬的頁面,ViewPager容器內(nèi)的所有Fragment都會(huì)立刻調(diào)用了supportVisible()可見可見函數(shù)勃痴,無論這些Fragment是不是都顯示了谒所。當(dāng)然,onLazyInitView懶加載也被調(diào)用了沛申。

目前我所知道有三種解決辦法,分享下

1姐军、找作者或者接手Fragmentation項(xiàng)目的大佬解決這個(gè)問題铁材。
2、自己動(dòng)手豐衣足食
3奕锌、用回ViewPagerBEHAVIOR_SET_USER_VISIBLE_HINT

方法這么多著觉,足足有三個(gè),我們來用下排除法找答案惊暴。
第一個(gè)呢饼丘,我也提了issue了,就看接手大佬能不能看到了辽话。
第二個(gè)呢肄鸽,需要自己download整個(gè)項(xiàng)目下來改,下文會(huì)講
第三個(gè)呢油啤,如果你用的ViewPager1典徘,這可能就是換個(gè)Adapter或者改個(gè)參數(shù)的事,如果你用的是ViewPager2益咬,那你的工作量可能就有一點(diǎn)了逮诲,你自己掂量下,反正我是覺得ViewPager2不錯(cuò)。

怎么改嘛

注意:這個(gè)修改梅鹦,我會(huì)直接棄用onActivityCreated裆甩,而使用onStart和onResume來判斷Fragment是否處于活躍或顯示狀態(tài),即在onResume后再調(diào)用supportVisible齐唆,請(qǐng)注意檢查你的項(xiàng)目中業(yè)務(wù)邏輯順序是否有需要調(diào)整

1嗤栓、從Fragmentation下載這個(gè)庫,并導(dǎo)入到你的項(xiàng)目中

我相信有點(diǎn)經(jīng)驗(yàn)的開發(fā)人員都知道怎么import module蝶念。

2抛腕、從我fork的https://github.com/Ubitar/Fragmentation的fragmentation_core庫中找到下方這3個(gè)文件:VisibleDelegateSupportFragmentDelegate媒殉,以及BaseSupportFragment文件担敌,并覆蓋你項(xiàng)目中對(duì)應(yīng)的文件。

當(dāng)時(shí)的Fragmentation 的版本是 androidx 1.0.5

3廷蓉、然后全封,沒了,你們引用這個(gè)本地庫測(cè)試下吧桃犬,不要忘記把舊的fragmentation_core依賴去除

源碼修改解析

分析內(nèi)容

1刹悴、打開BaseSupportFragment,可以看到里面幾乎所有的方法都是通過SupportFragmentDelegate代理的攒暇,有了解過Fragment或者Activity源碼的人都知道這很Android土匀。從SupportFragmentDelegate源碼中搜索onSupportVisible函數(shù),發(fā)現(xiàn)是空的形用。

回到BaseSupportFragment再次搜索onSupportVisible的引用就轧,找到了調(diào)用其的VisibleDelegate

2、在VisibleDelegate中順著Fragment的生命周期去找有關(guān)分發(fā)可見性或直接控制可見性的函數(shù)田度。首先onCreateonResume方法是可以排除的妒御,在剩下的其他函數(shù)onActivityCreated()中可以找到有一個(gè)關(guān)于控制可見性的函數(shù),initVisible()镇饺。

3乎莉、調(diào)查下initVisible()
發(fā)現(xiàn)isFragmentVisible()很可疑,跟蹤奸笤。

就那么一句話惋啃,是真正判斷可見性的函數(shù)了。

那么我們寫個(gè)ViewPager運(yùn)行下揭保,調(diào)試看到fragment.getUserVisibleHint()在使用setMaxLifecycle的情況下無論如何都是true肥橙,所以當(dāng)ViewPager活躍時(shí),上面所有Fragment都被認(rèn)定為可見了秸侣,后面的onLazyInitView()也自然被調(diào)用了存筏。

4宠互、但是,先別急著修改isFragmentVisible()椭坚,由于使用了setMaxLifecycle的緣故予跌,需要把onActivityCreated()中的內(nèi)容遷移到onStart()中,遺棄onActivityCreated()

當(dāng)然善茎,BaseSupportFragmentSupportFragmentDelegate也要做出響應(yīng)的修改券册,具體修改內(nèi)容MySupportFragmentSupportFragmentDelegate 垂涯,注意烁焙,多了個(gè) onViewStateRestored()
5、現(xiàn)在回頭改isFragmentVisible()耕赘,既然setMaxLifecycle是通過onResume來通知可見性的骄蝇,那這里就是缺少了一個(gè)fragment.isResumed()
但是仔細(xì)觀察操骡,并不是所有地方isResumed()都是管用的例如這里的isResumed()恒定是false
那么我們就要把isFragmentVisible分為isFragmentVisibleOnResume()isFragmentVisibleOnPause()
替換掉原來的isFragmentVisible()

補(bǔ)充:

可能我的描述不夠直觀九火,https://github.com/Ubitar/Fragmentation 還是show me the code 最好,我沒有改Fragmentation的demo册招,僅僅修改了其core

疑問

1岔激、怎么沒有兼容setUserVisibleHint版本,直接跳setMaxLifecycle了是掰?

額虑鼎。我沒有寫,這個(gè)需要你看懂setMaxLifecycle的兼容后键痛,再回去把舊的代碼還原回來(onActivityCreatedisFragmentVisible之類)震叙,通過自己設(shè)置的Boolean值來控制是否兼容setMaxLifecycle





大哥散休,覺得可以的話Gayhub給個(gè)Star吧,他們是有交互效果的啊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乐尊,一起剝皮案震驚了整個(gè)濱河市戚丸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扔嵌,老刑警劉巖限府,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異痢缎,居然都是意外死亡胁勺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門独旷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來署穗,“玉大人寥裂,你說我怎么就攤上這事“钙#” “怎么了封恰?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)褐啡。 經(jīng)常有香客問我诺舔,道長(zhǎng),這世上最難降的妖魔是什么备畦? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任低飒,我火速辦了婚禮,結(jié)果婚禮上懂盐,老公的妹妹穿的比我還像新娘褥赊。我一直安慰自己,他們只是感情好允粤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布崭倘。 她就那樣靜靜地躺著,像睡著了一般类垫。 火紅的嫁衣襯著肌膚如雪司光。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天悉患,我揣著相機(jī)與錄音残家,去河邊找鬼。 笑死售躁,一個(gè)胖子當(dāng)著我的面吹牛坞淮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陪捷,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼回窘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了市袖?” 一聲冷哼從身側(cè)響起啡直,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苍碟,沒想到半個(gè)月后酒觅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡微峰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年舷丹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜓肆。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颜凯,死狀恐怖谋币,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情装获,我是刑警寧澤瑞信,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站穴豫,受9級(jí)特大地震影響凡简,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜精肃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一秤涩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧司抱,春花似錦筐眷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至资溃,卻和暖如春武翎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溶锭。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工宝恶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趴捅。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓垫毙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拱绑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子综芥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350