var manager = supportFragmentManager
val a = FragmentA()
val transaction = manager.beginTransaction()
transaction.add(R.id.group,a,"A")
transaction.addToBackStack("addA")
transaction.commit()
val a = manager.findFragmentByTag("A")
val transaction = manager.beginTransaction()
if(a != null){
transaction.remove(a)
transaction.addToBackStack("removeA")
transaction.commit()
}
else{
Toast.makeText(this,"The fragment A was not added before ",Toast.LENGTH_LONG).show()
}
val a = manager.findFragmentByTag("A")
val transaction = manager.beginTransaction()
if(a != null){
transaction.detach(a)
transaction.addToBackStack("detachA")
transaction.commit()
}
調用attach之前需要先有調用過detach
val a = manager.findFragmentByTag("A")
val transaction = manager.beginTransaction()
if(a != null){
transaction.attach(a)
transaction.addToBackStack("attachA")
transaction.commit()
}
val a = FragmentA()
val transaction = manager.beginTransaction()
transaction.replace(R.id.group,a,"A")
transaction.addToBackStack("replacewithA")
transaction.commit
彈出最頂部的 Transaction
popBackStack()
name :是指某次調用addToBackStack 所加上 的name
flags: 只有 0 或 POP_BACK_STACK_INCLUSIVE
flags為0時,彈出該 transAction 以上的 transAction
flags為1時(POP_BACK_STACK_INCLUSIVE),彈出該transAction (包括該transAction )以上的transAction 。
關於FragmentTransaction 調用下面幾個 method的作用,及所對應的生命週期
add :
onAttach->
onCreate->
onCreateView->
onActivityCreated->
onStart->
onResume
show & hide :
不會觸發任何生命週期函數
remove :
onPause->
onStop->
onDestoryView->
onDestory->
onDetach
replace :
可拆分為add和remove,
replace會先查找FragmentManager中是否包含相同mContainerId 的fragment,如果有就先remove它,然後再add它。
注意它是根據containerViewId來進行比較的,並不是依據對像是否相等來判斷的。
detach :
將Fragment的視圖銷毀,Fragment的狀態沒有被銷毀,還是被FragmentMenager管理。
(在調用detach之前需要先通過add添加Fragment)
onPause->
onStop->
onDestoryView
attach :
Fragment的view重新加載到UI視圖中,並顯示出來
(調用attach之前需要先調用detach)
onCreateView->
onActivityCreated->
onStarted->
onResumed
popBackStack()
下面舉個例子:
假如我現在 用 fragmentB 代替 另一個 fragment A 並把這段 Transaction 加入 BackStack中 如下:
fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
隨後我按了返回鍵,此時上面的transaction 會被彈出 backstack , 因為 是用 fragmentB 代替 fragment A , 所以在反轉這個 transaction 情況下 會需要 回復fragment A ,
假如 fragment A 還存在 , 則 fragment A 會從onStart() 和 onResume() 開始 , 如果 fragment A 已經銷毀了(destroyed) 則會需要 再產生 一個 fragment A 此時會從 onAttach 開始
而 fragmentB 如果在 transaction commit 之前是不存在, 他在 transaction期間 從 onAttach 開始 , 此時 fragmentB 在調用 popBackStack() 之後 會被銷毀 , 進入 Destoryed 的階段, 如果 fragmentB 在此次 transaction commit 之前是已經存在 ,則會進入 stopped ,
addToBackStack():
一般當我們按下返回鍵,這個 Fragment 會進入 destroyed 階段,如果在 FragmentTransaction( removing this Fragment)加入 BackStack 中,此Fragment 是進入 stopped 階段 , 下次要使用者再跳回這個Fragment 時,此 Fragment 會進入 OnResume 階段 .