小結Fragment與FragmentPagerAdapter的生命週期及其關係

本博客部份內容是來自http://blog.csdn.net/dreamzml/article/details/9951577


FragmentPagerAdapter

FragmentPagerAdapter 繼承自 PagerAdapter。相比通用的 PagerAdapter,該類更專一於每一頁均爲 Fragment 的狀況。如文檔所述,該類內的每個生成的 Fragment 都將保存在內存之中,所以適用於那些相對靜態的頁,數量也比較少的那種;若是須要處理有不少頁,而且數據動態性較大、佔用內存較多的狀況,應該使用FragmentStatePagerAdapter。FragmentPagerAdapter 重載實現了幾個必須的函數,所以來自 PagerAdapter 的函數,咱們只須要實現 getCount(),便可。且,因爲 FragmentPagerAdapter.instantiateItem() 的實現中,調用了一個新增的虛函數 getItem(),所以,咱們還至少須要實現一個 getItem()。所以,整體上來講,相對於繼承自 PagerAdapter,更方便一些。

    getItem()
        該類中新增的一個虛函數。函數的目的爲生成新的 Fragment 對象。重載該函數時須要注意這一點。在須要時,該函數將被 instantiateItem() 所調用。
        若是須要向 Fragment 對象傳遞相對靜態的數據時,咱們通常經過 Fragment.setArguments() 來進行,這部分代碼應當放到 getItem()。它們只會在新生成 Fragment 對象時執行一遍。
        若是須要在生成 Fragment 對象後,將數據集裏面一些動態的數據傳遞給該 Fragment,那麼,這部分代碼不適合放到 getItem() 中。由於當數據集發生變化時,每每對應的 Fragment 已經生成,若是傳遞數據部分代碼放到了 getItem() 中,這部分代碼將不會被調用。這也是爲何不少人發現調用 PagerAdapter.notifyDataSetChanged() 後,getItem() 沒有被調用的一個緣由。
    instantiateItem()
        函數中判斷一下要生成的 Fragment 是否已經生成過了,若是生成過了,就使用舊的,舊的將被 Fragment.attach();若是沒有,就調用 getItem() 生成一個新的,新的對象將被 FragmentTransation.add()。
        FragmentPagerAdapter 會將全部生成的 Fragment 對象經過 FragmentManager 保存起來備用,之後須要該 Fragment 時,都會從 FragmentManager 讀取,而不會再次調用 getItem() 方法。
        若是須要在生成 Fragment 對象後,將數據集中的一些數據傳遞給該 Fragment,這部分代碼應該放到這個函數的重載裏。在咱們繼承的子類中,重載該函數,並調用 FragmentPagerAdapter.instantiateItem() 取得該函數返回 Fragment 對象,而後,咱們該 Fragment 對象中對應的方法,將數據傳遞過去,而後返回該對象。
        不然,若是將這部分傳遞數據的代碼放到 getItem()中,在 PagerAdapter.notifyDataSetChanged() 後,這部分數據設置代碼將不會被調用。
    destroyItem()
        該函數被調用後,會對 Fragment 進行 FragmentTransaction.detach()。這裏不是 remove(),只是 detach(),所以 Fragment 還在 FragmentManager 管理中,Fragment 所佔用的資源不會被釋放。

api

FragmentPagerAdapter默認是先預加載一頁的,好比顯示了第1頁,就會把第2頁也加載了,先調用FragmentPagerAdapter的構造方法 MyPagerAdapter(FragmentManager fm),再調用instantiateItem(ViewGroup container, int position) 函數中判斷一下要生成的 Fragment 是否已經生成過了,若是生成過了,就使用舊的,舊的將被 Fragment.attach();若是沒有,就調用 getItem() 生成一個新的,而後再調用ChatFragment與foundFragment的生命週期

ide

轉載自:https://blog.csdn.net/fangkailong/article/details/38268509函數

 

FragmentManager的一些api:
不一樣的FragmentManager:

見其名,知其意,是關於Fragment的管理器,在開發中,使用比較多;
其中關於Manager,用的比較多的API:
- getSupportFragmentManager():在Activity中使用Fragment的管理器,對全部Fragment進行管理。
- getFragmentManager():與 getSupportFragmentManager()功能是同樣的,只是是在Fragment中使用
- getChildFragmentManager():在Fragment嵌套使用中常用到,但這裏須要注意一個點,看下圖:

解析圖
在fragment建立childFragment的時候,須要注意的是:使用getChildFragmentManager() 使用getFragmentManager()會致使內存泄漏,在嵌套的Fragment中,內部的fragment建立,須要使用getChildFragmentManager()
FragmentManager經常使用的api:

    getFragments():能夠獲取全部建立時候add進去的全部Fragment;一般能夠經過這個api來獲取須要指定操做的fragment對象

    manager.findFragmentByTag(String tag): 經過TAG獲取指定的Fragment;這個TAG,是在建立Fragment時,調用addToBackStack(String tag)進行綁定關係的

    popBackStack(): 彈出棧頂fragment

    popBackStack(String tag,int flags):
        tag能夠爲null或者相對應的tag,flags只有0和1(POP_BACK_STACK_INCLUSIVE)兩種狀況
        若是tag爲null,flags爲0時,彈出回退棧中最上層的那個fragment。
        若是tag爲null ,flags爲1時,彈出回退棧中全部fragment。
        若是tag不爲null,那就會找到這個tag所對應的fragment,flags爲0時,彈出該
        fragment以上的Fragment,若是是1,彈出該fragment(包括該fragment)以
        上的fragment。

    popBackStackImmediate相關的方法與上面邏輯是同樣的與上面不一樣的是,在調用的時候會當即執行彈出。

FragmentTransaction:

管理着Fragment全部的展現交互,還有Fragment的回滾事件
FragmentTransaction經常使用的api:

    add():將一個Fragment實例對象添加到集合列表的尾部,當展現的時候會在activity的最上層
    remove():將一個Fragment實例對象從存儲的集合列表中移除,而且將其從UI界面中銷燬
    replace():將上一個Fragmnt的實例對象從存儲的集合列表中移除,將當前的Fragment實例對象添加到存儲的鏈表尾部,當展現的時候會在activity的最上層
    hide():將一個fragment,從展現狀態隱藏起來,實例對象不被銷燬
    show():將一個fragment實例對象,展現出來

    addToBackStack():將fragment添加到回退棧中

    add() 和 replace() 運用總結:

    在項目的使用中,一般習慣使用add()加載,add方式視圖不會重建,會被保存起來,而replace()每次都會remove掉前面的視圖,而replace方式的回退,舊的視圖每一次都會重建,在用戶體驗上很差。

    add()和replace()的使用,不可以混合使用,在混合使用的狀況下,會致使回退棧混亂,致使的緣由是在回退過程當中記錄的角標存在問題

    hide() 和 show() 運用總結:

    一般的使用狀況是在主界面上,有多Tab鍵切換狀況

FragmentTransaction事兒須要用到的api:

    detach():將視圖View和Fragment分離,視圖View也會從ViewTree中刪除,還會將Fragment從add的隊列中刪除,因此在調用isAdd方法的時候返回的是false,但實例對象自己是還存在的,經過FragmentManager的findFragmentByTag還能夠獲取到實例對象。
    attach():經過fragment的onCreateView()的重建視圖,而且被從新加入到add的隊列中,而且處於隊列頭部。

.net

 

轉載自:https://blog.csdn.net/qq_20280683/article/details/79641182對象

相關文章
相關標籤/搜索