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你的。匿了。 我在銀行工作,推薦你去德勤,辛苦了還有結果,銀...
與自己對話 反思與行動
高效人生手冊 人唯一完整擁有,可以完全控制的東西,只有自己!包括自我的身體,意志和行為。我們要承認自己的孤獨,容易走極端。往大處看容易陷入無力,虛無感,人存在沒有意義,到頭來一場空,何必努力。往小處看,盡是芝麻綠豆小事,索然無味,陷入如此平凡之生活中,有何樂趣。所以每個人都會不自覺地尋找存在感,找到...