ViewPager下Fragment的生命周期

為什么寫這個(gè)

在網(wǎng)上也有很多這個(gè)例子,但是感覺講的都不很清楚,于是想自己跑一遍來看看整個(gè)過程,話不多說,下面就直接開始,我們知道ViewPager對(duì)fragment的管理其實(shí)是通過Adapter來管理的,下面我就分情況一一介紹,首先是Adapter繼承FragmentPagerAdapter時(shí)的情況。

先吐槽一下

我之前其實(shí)已經(jīng)快寫好了博客,但是,后面突然發(fā)現(xiàn)我設(shè)置Log的位置不對(duì),設(shè)置在了super之前,這個(gè)時(shí)候方法還沒執(zhí)行完,只是開始執(zhí)行,這時(shí)就會(huì)產(chǎn)生一些偏差,就是一點(diǎn)不同,就是在啟動(dòng)程序的時(shí)候的setUserVisibleHint()方法的執(zhí)行時(shí)間上不同,如下:

Log語(yǔ)句放在super之前

showFirstFragment&&limite1-2016116

Log語(yǔ)句放在super之后

showFirstFragment&&limite1-2016118

別的時(shí)候都是一樣的。

以下的測(cè)試都是將Log語(yǔ)句放在super后面的時(shí)候的生命周期

當(dāng)Adapter繼承FragmentPagerAdapter

先上Adapter的代碼

  public class MyAdapter extends FragmentPagerAdapter{
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Fragment getItem(int position) {
        return list.get(position);
    }
}  

在我們使用的時(shí)候Adapter一般都是這么寫的,測(cè)試的時(shí)候,我在viewpager中加了四個(gè)fragment,主要代碼如下

    myAdapter=new MyAdapter(getSupportFragmentManager());
    viewPager.setOffscreenPageLimit(1);
    viewPager.setAdapter(myAdapter);
    viewPager.setCurrentItem(0);
    fragmentManager=getSupportFragmentManager();  

我們直接看結(jié)果:
當(dāng)程序啟動(dòng)的時(shí)候,生命周期如下:

showFirstFragment&&limite1-2016118

當(dāng)從第一個(gè)fragment滑到第二個(gè)fragment的時(shí)候

first- two-20161110

當(dāng)從第二個(gè)滑到第三個(gè)的時(shí)候

two-three-2016116

當(dāng)從第三個(gè)滑到第四個(gè)的時(shí)候

three-four-2016116

當(dāng)從第四個(gè)滑到第三個(gè)的時(shí)候

four-three-2016116

當(dāng)從第三個(gè)滑到第二個(gè)的時(shí)候

three-two-2016116

當(dāng)從第二個(gè)滑到第一個(gè)的時(shí)候

two-first-2016116

由上圖,我們可以得出,當(dāng)程序執(zhí)行的時(shí)候,viewpager加載fragment的順序是,先onAttach當(dāng)前的fragment,再向左遍歷左邊的fragment,遍歷右完后,再向遍歷,但這只是onAttach和onCreate的執(zhí)行順序,然后當(dāng)OnCreateView和onActivityCreated的時(shí)候則是先遍歷加載左邊的,再遍歷加載右邊的,最后才是當(dāng)前頁(yè)。然后第一次的onStart、onResume的時(shí)候則是又按照onAttach和onCreate的順序執(zhí)行。為什么要說第一次的onStart、onResume,因?yàn)楫?dāng)屏幕關(guān)閉的時(shí)候,執(zhí)行順序還是按照OnCreateView和onActivityCreated的順序,這里選的時(shí)間是從第一個(gè)fragment滑到第二個(gè)fragment之后,關(guān)閉屏幕,生命周期如下:

first-two&&onPause-2016116

看到這里,估計(jì)很多人就很亂了,就想問fragment的加載順序到底是什么呢?這時(shí),我通過如下代碼得到fragment的list表,代碼如下:

 getfragmentList=getSupportFragmentManager().getFragments();
    Log.e("log", "getfragmentlist"  + getfragmentList);
    if(getfragmentList!=null) {
        for (int i = 0; i <getfragmentList.size();i++)
            Log.e("log", "getfragmentlist" +i  + getfragmentList.get(i));
    }

這時(shí),運(yùn)行程序,加載完所有的fragment后的list順序,如下:

first showfragmentlist-20161110

由于屏幕原因,list中的后面看不到,但是通過for循環(huán)中的輸出,還是可以看出fragment加載順序其實(shí)是
fragment2 fragment1 fragment3 fragment4,也就是onCreateView、onActivityCreated時(shí)的順序,也就是說在onCreateView的時(shí)候建立了fragment的順序,除了第一次,后面的生命周期都是按照這個(gè)順序走的(除了滑動(dòng)的時(shí)候),就像上面的關(guān)閉屏幕時(shí)候的生命周期一樣,細(xì)心的朋友可能注意到了圖片后面的1 0 2 3,那這個(gè)是什么呢?這是各個(gè)fragment對(duì)應(yīng)的下標(biāo),這個(gè)是你在list中添加fragment的順序,如代碼:

public void addFragment(){
    list.add(myfragment1);
    list.add(myfragment2);
    list.add(myfragment3);
    list.add(myfragment4);
}

也就是fragemnt2對(duì)應(yīng)1,fragemnt1對(duì)應(yīng)0,fragemnt3對(duì)應(yīng)2,fragemnt4對(duì)應(yīng)3,這個(gè)順序控制著fragment在頁(yè)面中的順序,也就是fragment1,fragment2,fragment3,fragment4。這里驗(yàn)證一下,修改代碼,如下:

public void addFragment(){
    list.add(myfragment2);
    list.add(myfragment1);
    list.add(myfragment3);
    list.add(myfragment4);
}

運(yùn)行程序,加載完所有的fragment后的list的順序,如下:

showFragmentList&&first&&curr0,limit1, not order-20161110

這里就是fragment1對(duì)應(yīng)1,fragment2對(duì)應(yīng)0,fragment3對(duì)應(yīng)2,fragment4對(duì)應(yīng)3,頁(yè)面中的fragment順序是fragment2,fragment1,fragment3,fragment4。

還是拿之前的在list中添加fragment的順序來進(jìn)行下面的測(cè)試,也就是fragemnt2對(duì)應(yīng)1,fragemnt1對(duì)應(yīng)0,fragemnt3對(duì)應(yīng)2,fragemnt4對(duì)應(yīng)3,即fragment在頁(yè)面中的順序,也就是fragment1,fragment2,fragment3,fragment4來繼續(xù)說,因?yàn)槲覀冊(cè)O(shè)置了** viewPager.setCurrentItem(0);,所以我們先onAttach ,onCreate fragemnt1,又設(shè)置了 viewPager.setOffscreenPageLimit(1);,所以再
onAttach ,onCreate fragemnt2,那么為什么先onCreateView onActivityCreated fragment2呢?這是因?yàn)関iewpager的加載機(jī)制,會(huì)自動(dòng)的將左右兩邊加載出來,所以,一下子就會(huì)加載兩個(gè),為了確保所有的view都創(chuàng)建,所以,將最開始要顯示的view放在最后,即把fragment2的onCreateView,onActivityCreated放在fragment1的后面,那么,為什么fragment1的onStart,onResume先執(zhí)行呢?這是為了用戶體驗(yàn),即將當(dāng)前需要顯示的先顯示,因?yàn)檫@個(gè)時(shí)候是fragment1先顯示。這里有一個(gè)奇怪的地方,就是
第二個(gè)滑到第三個(gè)和第三個(gè)滑到第二個(gè)的圖片**,第二個(gè)滑到第三個(gè)的時(shí)候,fragment1是先執(zhí)行onPause,onStop,onDestroy方法,再執(zhí)行fragment4的onCreateView,onActivityCreated,onStart,onResume方法,而第三個(gè)滑到第二個(gè)的時(shí)候,則是先執(zhí)行fragment1的onCreateView,onActivityCreated再執(zhí)行fragemnt4的onPause,onStop,onDestroy方法,最后再執(zhí)行onStart,onResume方法。為什么呢?這里先放一下,先驗(yàn)證上面的猜想,將代碼修改一下

 myAdapter=new MyAdapter(getSupportFragmentManager());
    viewPager.setOffscreenPageLimit(2);
    viewPager.setAdapter(myAdapter);
    viewPager.setCurrentItem(1);
    fragmentManager=getSupportFragmentManager();

結(jié)果如下:

showFirstFragment&&curr1limit2-2016116

所以,這個(gè)順序也驗(yàn)證了我們之前的想法,但是那個(gè)奇怪的地方還沒解決,我們?cè)傩薷拇a:

  myAdapter=new MyAdapter(getSupportFragmentManager());
    viewPager.setOffscreenPageLimit(1);
    viewPager.setAdapter(myAdapter);
    viewPager.setCurrentItem(1);
    fragmentManager=getSupportFragmentManager();

程序運(yùn)行結(jié)果如下:

firstShowFragmentcurr1limit1-2016116

因?yàn)槲覀冿@示的就是第二個(gè)頁(yè)面,所以從第二個(gè)頁(yè)面滑到第三個(gè),效果如下:

two-three&&curr1limit1-2016116

從第三個(gè)滑到第二個(gè),效果如下:

three-two&&curr1limit1-2016116

我們?cè)偌虞d完所有的fragment,再?gòu)牡诙€(gè)滑到第三個(gè)試試,就是不執(zhí)行onAttach和onCreate,這樣看的舒服一點(diǎn),結(jié)果如下:
two-three&&curr1limit1loadallfragment-2016117

可以看到,執(zhí)行順序其實(shí)是類似的。也就是,當(dāng)fragemnt3滑到fragemnt2的時(shí)候,fragemnt1的onCreateView和onActivityCreated會(huì)在fragemnt4的onPause,onStop,onDestroyView,先執(zhí)行,然后再執(zhí)行fragment1的onStart,onResume,為什么呢?我覺得,為了便以理解,可以將fragment的生命周期分成四部分,第一部分就是onAttach,onCreate。第二部分是onCreateView,onActivityCreated。第三部分是onStart,onResume。第四部分就是onPause,onStop,onDestroyView。因?yàn)椋琭ragmentPagerAdapter只會(huì)銷毀視圖,所以后面的onDestroy,onDetach就不用管,當(dāng)onAttach,onCreate之后,會(huì)先確定一個(gè)順序,這里稱為順序2,也就是中左右,但是當(dāng)onCreateView執(zhí)行后,就確定了順序3,這個(gè)順序3就是getSupportFragmentManager().getFragments();得到的list的順序,后面的生命周期(除了第一次啟動(dòng)以及左右滑動(dòng)時(shí)的生命周期)都是按照這個(gè)順序執(zhí)行的,也就是左右中,為什么說除了第一次啟動(dòng)以及左右滑動(dòng)時(shí)的生命周期,這里先說第一次啟動(dòng),因?yàn)椋诘谝淮螁?dòng)后的onStart和onResume都是按照onAttach的順序,而不是按照fragment的順序,左右滑動(dòng)的生命周期是按照你在viewPager中給添加fragment的順序,這一點(diǎn)后面解釋,確定了fragment順序后,排在鏈表前面的fragment的方法肯定在排在后面的fragment方法之前,這一點(diǎn)很重要,舉個(gè)例子,就比如上面的關(guān)閉屏幕那張生命周期圖片,因?yàn)殒湵淼捻樞颍陨芷跁?huì)是這樣。這里再解釋上面的滑動(dòng)順序,這里貼上我添加fragment的代碼

    list.add(myfragment1);
    list.add(myfragment2);
    list.add(myfragment3);
    list.add(myfragment4);

可以看出順序是fragment1,2,3,4。這個(gè)順序就是順序1,順序1是在滑動(dòng)的情況會(huì)用到。為什么我會(huì)將之前的順序命名為順序2,因?yàn)檫@個(gè)順序是最開始你在程序中通過add(fragment)確定的順序,在滑動(dòng)的時(shí)候,誰在前面誰先生成視圖或者先銷毀,也就是誰在前面誰先執(zhí)行,這里需要明確一點(diǎn)就是,任何fragment的第一部分生命周期肯定運(yùn)行在別的fragment的除第一部分生命周期的生命周期前面,這一點(diǎn)很重要,同時(shí)還有一點(diǎn),當(dāng)既有fragment視圖生成又有fragment視圖銷毀的時(shí)候,其實(shí)就是滑動(dòng)的時(shí)候,對(duì)于生成視圖的那個(gè)fragment的第一部分生命周期和第二部分的生命周期不會(huì)同時(shí)進(jìn)行,這里解釋后面一點(diǎn),修改代碼:

myAdapter=new MyAdapter(getSupportFragmentManager());
    viewPager.setOffscreenPageLimit(1);
    viewPager.setAdapter(myAdapter);
    viewPager.setCurrentItem(3);

當(dāng)?shù)谝淮螐?滑到2的時(shí)候生命周期如圖:

thrid-second&& curr3,limit1-20161110

因?yàn)轫樞?是fragment1,2,3,4。所以應(yīng)該是fragment1先執(zhí)行第一部分,再執(zhí)行第二部分生成視圖,再fragment4執(zhí)行銷毀視圖,再fragment1執(zhí)行第三部分。但是結(jié)果卻是這個(gè),說明當(dāng)既有fragment視圖生成又有fragment視圖銷毀的時(shí)候,其實(shí)就是滑動(dòng)的時(shí)候,對(duì)于生成視圖的那個(gè)fragment的第一部分生命周期和第二部分的生命周期不會(huì)同時(shí)進(jìn)行。

看第二個(gè)滑到第三個(gè),第三個(gè)滑到第二個(gè)這個(gè)情況,先看第一次第二個(gè)滑到第三個(gè)的情況,因?yàn)椋魏蝔ragment的第一部分生命周期肯定運(yùn)行在別的fragment的除第一部分生命周期的生命周期前面,同時(shí)哦,對(duì)于生成視圖的那個(gè)fragment的第一部分生命周期和第二部分的生命周期不會(huì)同時(shí)進(jìn)行,又因?yàn)樵陧樞?中,fragment1在fragment4的前面,所以,fragment1先銷毀,fragment4再生成和顯示,所以,先執(zhí)行fragment1的onAttach,onCreate,再執(zhí)行fragment1的onPause,onStop,onDestroyView,再執(zhí)行fragment4的onCreateView,onActivityCreated。而在第三個(gè)滑到第二個(gè)時(shí),因?yàn)椋恍枰猳nAttach和onCreate,又因?yàn)樵陧樞?中,fragment1在fragment4的前面,所以,會(huì)先執(zhí)行fragment1的onCreateView,onActivityCreated,再執(zhí)行fragment4的onPause,onStop,onDestroyView。然后到顯示的時(shí)候,再執(zhí)行fragment1的onStart,onResume。為什么不會(huì)直接運(yùn)行fragment1的onCreateView,onActivityCreated,onStart,onResume呢?因?yàn)関iewPager.setOffscreenPageLimit(1);方法的限制,所以只有先將銷毀視圖的fragment的視圖銷毀,才能顯示,所以接下來執(zhí)行fragment4的onPause,onStop,onDestroyView,最后執(zhí)行fragment1的onStart,onResume。然后,再一次從第二個(gè)滑到第三個(gè)的情況,因?yàn)椋恍枰猳nAttach和onCreate,又因?yàn)樵陧樞?中,fragment1在fragment4的前面,所以,fragment1先銷毀,fragment4再生成和顯示,所以,先執(zhí)行fragment1的onPause,onStop,onDestroyView,再執(zhí)行fragment4的onCreateView,onActivityCreated,onStart,onResume。這里可能有人會(huì)說,為什么不是按照順序2來判斷,因?yàn)樵陧樞?中,fragment1也是在fragment4之前呀,這里還是原來的代碼:

  myAdapter=new MyAdapter(getSupportFragmentManager());
    viewPager.setOffscreenPageLimit(1);
    viewPager.setAdapter(myAdapter);
    viewPager.setCurrentItem(3);

這時(shí),順序1是fragment1,2,3,4.而順序2變成fragment4,3,2,1。這兩個(gè)順序中fragment1和fragment4順序不一樣,看從2滑到3的生命周期,如圖:


second-thrid&&first,curr3,limit1-2016118
second-thrid&&first,curr3,limit1-2016118

因?yàn)閒ragment1先銷毀fragment4再生成顯示,所以是按照順序1,不是順序2。為了驗(yàn)證我的猜想,然后我去翻源代碼,找了好久,但是沒有找到,原諒我是個(gè)彩筆,如果有大神找到,請(qǐng)告訴我。不勝感激。 同時(shí),這里還有一點(diǎn),那就是setUserVisibleHint()方法執(zhí)行的時(shí)間,這個(gè)方法不是屬于生命周期的范圍,我覺得這個(gè)方法調(diào)用的時(shí)間是如果是都要生成視圖,也就是第一次顯示的時(shí)候,那么就和onAttach的順序是一樣的,如果顯示后移動(dòng)的情況,那么看移動(dòng)到當(dāng)前位置時(shí)是否需要生成新的fragment視圖,如果需要先生成,即先執(zhí)行生成頁(yè)的setUserVisibleHint()方法,然后再執(zhí)行先前頁(yè)的這個(gè)方法,在執(zhí)行當(dāng)前頁(yè)的這個(gè)方法就像當(dāng)從第二頁(yè)滑到第三頁(yè)的時(shí)候setUserVisibleHint()方法執(zhí)行的順序一樣,即先執(zhí)行fragment4的setUserVisibleHint()方法,再執(zhí)行fragment2的setUserVisibleHint()方法,最后再是fragment3的setUserVisibleHint()方法。
總的來說,為了便以理解,可以將fragment的生命周期分成四部分,第一部分就是onAttach,onCreate。第二部分是onCreateView,onActivityCreated。第三部分是onStart,onResume。第四部分就是onPause,onStop,onDestroyView。因?yàn)椋琭ragmentPagerAdapter只會(huì)銷毀視圖,所以后面的onDestroy,onDetach就不用管,,**順序1是由viewpager中的添加fragment時(shí)設(shè)置的,順序2是根據(jù)順序1和viewPager.setCurrentItem();,以及viewPager.setOffscreenPageLimit(1);共同決定的,順序2就是在順序1中先找出viewPager.setCurrentItem()的fragment,然后向左遍歷fragment,然后向右遍歷fragment。這就是onAttach,onCreate的順序,舉個(gè)例子,順序1是1,2,3,4。viewPager.setCurrentItem(0),viewPager.setOffscreenPageLimit(1);,那么順序2就是fragment2,1,3,4。如果viewPager.setCurrentItem(2),viewPager.setOffscreenPageLimit(1);不變,順序2就是2,3,4,1。如果是viewPager.setCurrentItem(2),viewPager.setOffscreenPageLimit(2);,順序2就是fragment2,1,4,3。順序3也是順序1和viewPager.setCurrentItem();,以及viewPager.setOffscreenPageLimit(1);共同決定的,只是先遍歷viewPager.setCurrentItem();,再遍歷viewPager.setCurrentItem();右邊的,最后再 遍歷viewPager.setCurrentItem();,順序3使用最廣泛,除了順序1和順序2,別的都是順序3。
更簡(jiǎn)單的說,為了便以理解,可以將fragment的生命周期分成四部分,第一部分就是onAttach,onCreate。第二部分是onCreateView,onActivityCreated。第三部分是onStart,onResume。第四部分就是onPause,onStop,onDestroyView。因?yàn)椋琭ragmentPagerAdapter只會(huì)銷毀視圖,所以后面的onDestroy,onDetach就不用管記住幾個(gè)規(guī)則:

1.有三個(gè)順序,分別是順序1,順序2,順序3。順序1就是添加fragment的順序,順序2就是中左右,順序3就是左右中。

2.第一次啟動(dòng)的時(shí)候,生命周期的第一,三部分按照順序2,第二部分按照順序3

3.滑動(dòng)的時(shí)候按照順序1,并且誰在前面誰先生成視圖或者先銷毀,也就是誰在前面誰先執(zhí)行,但是,生命周期的第一部分和第二部分不會(huì)在一起執(zhí)行。也就是說當(dāng)生成視圖的fragment在銷毀視圖的fragment之前,但是同時(shí),生成視圖的fragment的第一部分要執(zhí)行,這時(shí),執(zhí)行順序就是,生成視圖的fragment的第一部分,銷毀視圖的fragment第四部分,生成視圖的fragment的第二部分,第三部分。如果,這時(shí),生成視圖的fragment的第一部分不用執(zhí)行,那么就會(huì)先執(zhí)行生成視圖的fragment的第二部分,當(dāng)要執(zhí)行第三部分的之后,由于viewPager.setOffscreenPageLimit(1);方法的限制,所以只有先將銷毀視圖的fragment的視圖銷毀,才能顯示,所以第三部分沒有直接跟著第二部分執(zhí)行,而是最后執(zhí)行。

4.剩下的時(shí)候都是按照順序3,比如關(guān)閉屏幕,重新顯示之類的。

5.因?yàn)閟etUserVisibleHint()這個(gè)方法,不算生命周期,所以這個(gè)執(zhí)行的時(shí)間就是誰先顯示誰先調(diào)用,并且,當(dāng)isVisibleToUser為false的時(shí)候執(zhí)行在第一部分之前,isVisibleToUser為true的時(shí)候執(zhí)行在第一部分之后

說的很啰嗦,其實(shí)看圖片的結(jié)果就知道了,為了驗(yàn)證上面的結(jié)果,我去翻源碼,找了好久,但是沒找到,原諒我水平不夠,如果有大神找到的話,請(qǐng)告訴我,不勝感激。**

當(dāng)Adapter繼承FragmentStatePagerAdapter

先上Adapter代碼

 public class MyAdapter extends FragmentStatePagerAdapter{
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Fragment getItem(int position) {
        return list.get(position);
    }
}

程序主要代碼如下:

myAdapter=new MyAdapter(getSupportFragmentManager());
    viewPager.setOffscreenPageLimit(1);
    viewPager.setAdapter(myAdapter);
    viewPager.setCurrentItem(0);
    fragmentManager=getSupportFragmentManager();  

程序運(yùn)行結(jié)果:

showSecondFragment&& curr0 limit1-2016118

第一個(gè)滑到第二個(gè)

first-second&&second,curr0,limit1-2016117

第二個(gè)滑到第三個(gè)

second-thrid&& second,curr0,limit1-20161110

第三個(gè)滑到第四個(gè)

thrid-fouth&&second,curr0,limit1-2016117

第四個(gè)滑到第三個(gè)

fouth-thrid&&second,curr0,limit1-2016117

第三個(gè)滑到第二個(gè)

thrid-second&&second,curr0,limit1-2016117

第二個(gè)滑到第一個(gè)

second-first&&second,curr0,limit1-2016117

第一個(gè)滑到第二個(gè)后按Pause

first-second&&second,curr0,limit1,pause-2016117

第一個(gè)滑到第二個(gè)后的fragemntList

first-secondShowFragmentList&&second,curr0,limit1,-2016117

第二個(gè)滑到第三個(gè)后的fragemntList

two-threeShowFragmentList&& second,curr0,limit1-20161110

第三個(gè)滑到第二個(gè)后的fragmentList

thrid-secondShowFragmentList&& Second,curr0,limit1-20161110

從上圖可以看出,跟FragmentPagerAdapter相比,FragmentStatePagerAdapter每次銷毀的時(shí)候是直接remove,所以會(huì)在銷毀之后重新顯示的話,就會(huì)執(zhí)行fragment的所有周期函數(shù)來顯示。

FragmentPagerAdapter的destroyItem()方法

 @Override
public void destroyItem(ViewGroup container, int position, Object object) {
    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
            + " v=" + ((Fragment)object).getView());
    mCurTransaction.detach((Fragment)object);
}  

FragmentStatePagerAdapter的destroyItem()方法

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    Fragment fragment = (Fragment) object;

    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
            + " v=" + ((Fragment)object).getView());
    while (mSavedState.size() <= position) {
        mSavedState.add(null);
    }
    mSavedState.set(position, fragment.isAdded()
            ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
    mFragments.set(position, null);

    mCurTransaction.remove(fragment);
}

注意最后兩張圖片中的list,分別有一個(gè)是空的,這也就說明,這里的fragment為空,但是依然占著位置,下次生成這個(gè)的時(shí)候,直接插入到這個(gè)位置,所以順序2還是不會(huì)改變。同時(shí),也沒有后面的1 0 2 3,同時(shí),上面劃分的Fragment生命周期四部分也不一樣,最后一部分應(yīng)該再加上onDestroy,onDetach。生命周期的差異就體現(xiàn)在當(dāng)有銷毀又有生成fragment的視圖的時(shí)候,這個(gè)時(shí)候跟FragmentPagerAdapter不一樣,都是生成視圖的fragment的第一部分先執(zhí)行,再銷毀視圖的fragment去銷毀視圖,再生成視圖的fragment顯示。其實(shí)這就是上面的規(guī)則3。

當(dāng)使用懶加載的時(shí)候呢?

很明顯生命周期會(huì)是一樣的,因?yàn)樵O(shè)置懶加載的操作,并沒有影響生命周期,所以生命周期是一樣的,只是懶加載保證了顯示哪頁(yè)加載哪頁(yè)的數(shù)據(jù),有興趣的朋友可以自己測(cè)試一下,畢竟紙上得來終覺淺,絕知此事要躬行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容