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

时间:2023-12-15 20:05:44

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的值,不会发生异常。