天天看點

FragmentManager與FragmentTransactioin

FragmentManager為Fragment的管理類:

FragmentManager能夠實作管理activity中fragment.

通過調用activity的getFragmentManager()或者getSupportFragmentManager()取得它的執行個體

FragmentManager可以做如下一些事情:

1、使用findFragmentById() (用于在activity layout中提供一個UI的fragment)或findFragmentByTag()(适用于有或沒有UI的fragment)

擷取activity中存在的fragment,但是在fragmentTransaction将新的add的fragment操作送出前,且送出後不會立刻生效,是不能通過

FragmentManager的find功能函數去找到目标fragment的,因為還沒加進去。

2、将fragment從背景堆棧中彈出, 使用 popBackStack() (模拟使用者按下BACK 指令).

3、使用addOnBackStackChangeListener()注冊一個監聽背景堆棧變化的listener.

FragmentTransaction:

FragmentTransaction對fragment進行添加,移除,替換,以及執行其他動作。

擷取FragmentTransaction執行個體:

FragmentManager fragmentManager = getFragmentManager();

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

在調用commit()之前, 你可能想調用 addToBackStack(),

将事務添加到一個fragment事務的back stack.

這個back stack由activity管理, 并允許使用者通過按下 BACK 按鍵傳回到前一個fragment狀态.

調用 commit() 并不立即執行事務.

恰恰相反, 它将事務安排排期, 一旦準備好, 就在activity的UI線程上運作(主線程).

如果有必要,你可以從你的UI線程調用 executePendingTransactions() 來立即執行由commit()送出的事務.

但這麼做通常不必要, 除非事務是其他線程中的job的一個從屬.

注意:

目前的fragment崩潰消除後,程式回讀取savedInstanseState中存儲的資料,

是以,當你調用FragmentTransaction的hide(),show()方法時,導緻沒有效果。

來回調用show(),hide()方法,很容易導緻fragment崩潰,需要重寫空的FragmentActivity的onSaveInstansceState()方法即可,

或者調用commitAllowingStateLoss方法,直接跳過讀取activity

的saveInstansceState這一過程都行。

還有一種很粗暴的的執行辦法:

直接通過FragmentManager.beginTransaction建立一個新的執行執行個體對fragment集合進行新的操作,隐患是消耗一定量的記憶體,且

不穩定,不能判斷丢失掉的saveINstatnceState何時造成影響