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的值,不會發生異常。