溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

四大組件(5) - Fragment

發(fā)布時間:2020-06-25 07:52:36 來源:網(wǎng)絡(luò) 閱讀:214 作者:lm8751 欄目:移動開發(fā)

Fragment

由于Activity太“重” 不能動態(tài)注冊、不能模塊化,因此引入Fragment


一、生命周期

onAttach():FragmentActivity相關(guān)聯(lián)時調(diào)用??梢酝ㄟ^該方法獲取Activity引用,還可以通過getArguments()獲取參數(shù)。

onCreateView():創(chuàng)建Fragment的布局。

onActivityCreated():當(dāng)Activity完成onCreate()時調(diào)用。

onDestroyView():當(dāng)FragmentUI從視圖結(jié)構(gòu)中移除時調(diào)用。

onDetach():當(dāng)FragmentActivity解除關(guān)聯(lián)時調(diào)用。

其它生命周期與Activity相同

上面的方法中,只有onCreateView()在重寫時不用寫super方法,其他都需要。




二、注意事項

1、參數(shù)傳遞 使用setArg(“bundle”),Fragment最好創(chuàng)建個newInstance(xx),讓調(diào)用者不需要知道key名稱

2、getActivityonAttach中獲取.

3、提交盡量用Commit,如在異步中提交,建議使用commitAllowingStateLoss()?

? ? ? ? commit? -> 安排當(dāng)前事務(wù)FragmentTransaction進(jìn)行提交。異步,必須在ActivityonSaveInstanceState調(diào)用之前提交。否則會拋異常。

commitAllowingStateLoss ->? commit類似。但是如果本次是在ActivityonSaveInstanceState調(diào)用之后,那么本次提交記錄在Activity恢復(fù)的時候,可能不被保存。

commitNow() -> 將事務(wù)立即提交。所有添加的Fragment會被立即初始化,并開始生命周期。所有被移除的Fragment將會被立即移除。

調(diào)用這個方法,相當(dāng)于調(diào)用commit,然后調(diào)用FragmentManagerexecutePendingTransactions()。

commitNowAllowingStateLoss() -> commitNow類似。但是如果在在ActivityonSaveInstanceState調(diào)用之后,那么本次提交記錄在Activity恢復(fù)的時候,可能不被保存。

?4..當(dāng)FragmentA(初始化)和FragmentB(后啟動)調(diào)用 fragmentTransaction.replace()

  "新建"??(onAttach->onCreate->onCreateView->onActivityCreated)

  "顯示" ?(onStart->onResume)

  "隱藏" ?(onPause->onStop)

  “結(jié)束” ?(onDestroyView->onDestroy->onDetach)

  FragmentA?"打開"--->執(zhí)行?"新建"??再執(zhí)行FragmentA "顯示"

  FragmentB?"打開"--->執(zhí)行FragmentA "隱藏" ?再才執(zhí)行FragmentA “關(guān)閉”?執(zhí)行?Fragment B?"新建"??再執(zhí)行Fragment B "顯示"

  FragmentB?"關(guān)閉"--->執(zhí)行FragmentB?"隱藏"??再才執(zhí)行FragmentB?“關(guān)閉”?最后執(zhí)行FragmentA "顯示"

5、防止fragment重新加載,浪費用戶流量或者影響用戶體驗。對于FragmentTransationreplace方法,官方的建議是如果上一個fragment是不保留的情況下可以使用。否則的話采用先add然后根據(jù)需求hide或者show,這樣可以實現(xiàn)fragment緩存,另外一張情況就是和ViewPager聯(lián)合使用,然后設(shè)置setOffscreenPageLimit()這個方法設(shè)置緩存的頁面的大小。?

加回退棧的操作,如果使用 addToBackStack(String)將會拋出一個 IllegalStateException的異常。


參考:

基礎(chǔ)(轉(zhuǎn)載):https://www.jianshu.com/p/11c8ced79193

進(jìn)階(轉(zhuǎn)載):https://www.jianshu.com/p/d9143a92ad94


備注: 個人筆記 ,有錯請及時指出 ,謝謝? 聯(lián)系QQ:285232718


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI