Android - addToBackStack()不起作用?

时间:2013-02-11 03:31:55

标签: android android-fragments

这是负责向后台堆栈添加片段的函数:

public void populateContent(File f)
{

    ContentFragment cf = new ContentFragment(ctx, ac, this);
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();;
    cf.updateView(f);

    transaction.replace(R.id.contentFragment, cf);

    transaction.addToBackStack(null);

    transaction.commit();

}

单击后退按钮时,最后一个片段无法加载(没有任何反应)。

知道可能导致这种情况的原因吗?

编辑:FragmentManager日志。

http://pastebin.com/mYnVdkLG

在我看来好像我的应用程序正在保存第二个视图两次,而不是保存第一个视图然后保存第二个视图。

3 个答案:

答案 0 :(得分:54)

似乎在片段事务上调用addToBackStack()是不够的,我们必须在我们自己按下的Back按钮上处理后备栈的弹出。我将此添加到我的活动中,它按预期工作:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

答案 1 :(得分:12)

我不确定实际的解决方案,但我可以指导你一点,也许你可以弄清问题是什么。

你真的在替换两个片段吗?如果不这样做,则没有要还原的事务。您是第一个从XML添加的Fragment吗?管理员不会知道这个片段,您可能还需要使用事务添加第一个Fragment

请务必检查if (savedInstanceState == null) performFirstTransaction(),否则您最终会添加第一个Fragment两次。

一个好主意是在enableDebugLogging中使用FragmentManager。这将告诉您经理知道哪些片段。

看到这个: http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)

作为旁注,建议不要为Fragment使用自定义构造函数。这是因为如果您的应用程序被操作系统杀死并重新实例化,它将调用空构造函数。

您应该使用ContentFragment.getInstance(<params>)之类的静态方法来创建Fragment

请在“课程概述”部分的http://developer.android.com/reference/android/app/Fragment.html查看更多信息。

我希望我的回答可以帮助你找到问题。

答案 2 :(得分:2)

我正在添加,而不是替换,但我必须在add()之前调用addToBackStack(null),而不是在将关闭的片段之后调用addToBackStack(null),而不是在将保持打开的片段上。

在A级(首先打开)

FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();

在B班(由A班开设)

FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(null);
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();