我希望能够使用replace
撤消FragmentTransaction
addToBackStack()
:
FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
Fragment scheduleFragment = new ScheduleFragment();
fragmentTransaction.replace(R.id.content_container, scheduleFragment, "scheduleFragment");
fragmentTransaction.addToBackStack("scheduleFragment");
fragmentTransaction.commit();
但在此之后,单击后退按钮不会执行任何操作。
来自doc,它应该扭转交易。
我错过了什么?
答案 0 :(得分:25)
执行此操作的正确方法是使用onBackPressed()
方法捕获应用中的返回事件,然后使用popBackStack()
“弹出”backStack。例如:
public void onBackPressed()
{
// Catch back action and pops from backstack
// (if you called previously to addToBackStack() in your transaction)
if (getSupportFragmentManager().getBackStackEntryCount() > 0){
getSupportFragmentManager().popBackStack();
}
// Default action on back pressed
else super.onBackPressed();
}
PD:很抱歉延迟回答,但我刚看到你的问题。希望它有所帮助!
答案 1 :(得分:4)
试试fragmentTransaction.addToBackStack(null)
addToBackStack()
的参数是后台状态的可选名称,您不使用replace()
方法中的标记,该方法只是片段的可选标记。
您可以阅读有关此here的更多信息。
答案 2 :(得分:2)
我已经有一段时间,但我希望这会对某人有所帮助。
如果您要延长fragmentTransaction.addToBackStack(null)
, AppCompatActivity
将无法运作。它在Activity
中效果很好。我无法找到原因。
答案 3 :(得分:0)
我实现了自己的Fragment
堆栈:
public Fragment addFragmentToStack(Fragment fragment){
if(MyApplication.fragmentStack.size()>20){
MyApplication.fragmentStack.remove(0);
}
return MyApplication.fragmentStack.push(fragment);
}
public void onBackPressed() {
if (MyApplication.fragmentStack.size() > 0) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_container, MyApplication.fragmentStack.pop());
ft.commit();
}
else{
finish();
}
}