Fragment回退棧&commit()和commitAllowingStateLoss()


Activity切換時是通過棧的形式,不斷壓棧出棧,在Fragment的時候,如果你不是手動開啟回退棧,它是直接銷毀再重建,但如果將Fragment任務添加到回退棧,情況就會不一樣了,它就有了類似Activity的棧管理方式。

使用Fragment時,可以通過用戶交互來執行一些動作,比如增加、移除、替換等。所有這些改變構成一個集合,這個集合被叫做一個transaction。

可以調用FragmentTransaction中的方法來處理這個transaction,並且可以將transaction存進由activity管理的back stack中,當用戶按返回鍵時,就會自動回到上一個fragment的狀態。和Activity一樣的使用體驗

public void startToFragment(Context context, int container, Fragment newFragment) {
        FragmentManager manager = context.getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(container, newFragment);
        transaction.addToBackStack(context.getClass().getName()); 
     transaction.commit();
}
Fragment2 fragment2 = new Fragment2 ();
startToFragment(getActivity(), R.id.layout_container, fragment2 );

1,在FragmentManager.transaction.addToBackStack();向一個棧中一個一個的添加Fragment,從而實現在你添加后,可以在按返回鍵時一個一個的返回Fragment

2,FragmentManager的popBackStack()方法,就是一個一個的返回Fragment

3,FragmentManager的popBackStack(name,flag)方法,就是

   //其中name是加入棧中的Fragment名字

   //flag表示移走棧中Fragment的方式(0:把自己之前的彈出)(1:包括自己都彈出)

4,FragmentManager的popBackStack(id,flag)方法

   //其中id,在FragmentManager事物提交時,會返回一個int值,每次提交會自動加1

   //flag表示移走棧中Fragment的方式(0:把自己之前的彈出)(1:包括自己都彈出)

(補充:FragmentManager.commit()會返回一個int值,標記這次的提交!!)

https://www.jianshu.com/p/b8aca9976608

 

commit()和commitAllowingStateLoss()的區別

Fragment的控制采用事務方式執行,在事務執行之前,用戶可能已經點擊了返回鍵,導致Activity的onSaveInstanceState()方法被調用,在保存當前activity實例的狀態以備恢復。

在onSaveInstanceState()方法中會將一個成員變量mStateSaved設為true。采用commit()方式提交事務,在執行時會檢查mStateSaved的值,若為true,則會拋出異常。因此事務必須保證在用戶點擊返回鍵之前執行。

而采用commitAllowingStateLoss()方式提交事務,在執行時不會檢查mStateSaved的值,不會發生異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM