Fragment與BackStack運作流程?

時間 2021-05-31 23:13:39

1樓:SamuraiSong

manager

=getSupportFragmentManager

();AFragment

fragment

=new

AFragment

();FragmentTransaction

transaction

=manager

.beginTransaction

();transaction

.replace

(viewId

,fragment

);transaction

.addToBackStack

();transaction

.commit

();其中對fragment的操作是下面這個方法

transaction

.replace

(viewId

,fragment

);這個方法可以分解成

transaction

.add

(viewId

,fragment

);transaction

.show

(fragment

);transaction

.hide

(preFragment

);transaction

.remove

(preFragment

);這兩種方式是等效的,只是下面的看起來更直白

那麼addToBackStack()這個方法究竟做了什麼?

呼叫addToBackStack()後按back鍵

AFragment 消失,preFragment又出現了,你在fragment的生命週期中加入log就會發現,AFragment銷毀,preFragment被重新建立

其實addToBackStack()記錄的是乙個transaction的操作記錄,當你按back鍵時,相當於呼叫了

transaction

.add

(viewId

,preFragment

);transaction

.show

(preFragment

);transaction

.hide

(fragment

);transaction

.remove

(fragment

);即transaction操作了100個fragment的行為,一旦按back鍵,會讀取這100個記錄,按反方向呼叫一次 add 變成remove hide 變成show

現在你明白為什麼MapFragment不見了吧

Callback.onReplace(R.id.fragment_container,new SettingFragment());

這個封裝方法記錄的只是SettingFragment代替了MainBizFragment,因此按back鍵只是反方向呼叫一次,並沒有儲存MainBizFragment中已經開啟MapFragment這一狀態

addToBackStack()儲存的是一系列針對乙個fragmentTransaction的操作記錄

addToBackStack()儲存的是一系列針對乙個fragmentTransaction的操作記錄

addToBackStack()儲存的是一系列針對乙個fragmentTransaction的操作記錄

重要的話要說三遍

那麼你的問題如何解決?

你只需儲存已經開啟MapFragment的這一狀態就可以了,在MainBizFragment的onResume(或其他更適合的生命週期函式)中判斷一下儲存的條件,選擇性的開啟MapFragment即可

或者,靈活運用 add remove hide show 這幾個方法,可以免除重複建立的開銷

Android開發中,Fragment真的有大家說的那麼不堪嗎?

王胖子 square有一篇為什麼不使用fragment的blog,主要集中在生命週期複雜,難以除錯,動畫支援不好,個人覺得,對於結構簡單的專案沒有什麼影響,如果頁面較多,就需要一套系統的解決方案來簡化開發風險,降低成員之間的溝通成本,這和使用哪個基本元件作為ui單元的承載沒有關係,可以基於Activ...

考研與德勤與CPA

有關係VIP進四大不是分分鐘的事嗎?既然都VIP了,自己又想去德勤,考研無非也就是給自己乙個考CPA的時間吧。三年研究生讀出來第一年基本工資就比本科高300塊,個人感覺本科能去就沒必要拖到研究生了,而且你VIP,我就不信小黑會有敢delay你的。匿了。 我在銀行工作,推薦你去德勤,辛苦了還有結果,銀...

與自己對話 反思與行動

高效人生手冊 人唯一完整擁有,可以完全控制的東西,只有自己!包括自我的身體,意志和行為。我們要承認自己的孤獨,容易走極端。往大處看容易陷入無力,虛無感,人存在沒有意義,到頭來一場空,何必努力。往小處看,盡是芝麻綠豆小事,索然無味,陷入如此平凡之生活中,有何樂趣。所以每個人都會不自覺地尋找存在感,找到...