使用addToBackStack进行Fragment事务后单击后退按钮不会执行任何操作

时间:2013-08-19 02:38:05

标签: android android-fragments fragmenttransaction

我希望能够使用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,它应该扭转交易。

我错过了什么?

4 个答案:

答案 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();
        }
}