Android-addToBackStack()不';不行?

Android-addToBackStack()不';不行?,android,android-fragments,Android,Android Fragments,这是负责将片段添加到后堆栈的函数: public void populateContent(File f) { ContentFragment cf = new ContentFragment(ctx, ac, this); FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();; cf.updateView(f); transaction.rep

这是负责将片段添加到后堆栈的函数:

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();

}
当我点击后退按钮时,最后一个片段没有被加载(什么也没有发生)

你知道是什么引起的吗

编辑:碎片管理器日志


在我看来,我的应用程序似乎在两次保存第二个视图,而不是先保存第一个视图,然后再保存第二个视图。

我不确定实际的解决方案,但我可以给您一些指导,也许您可以找出问题所在

你真的在替换两个碎片吗?如果没有,则没有要还原的事务。您的第一个
片段也是从XML添加的吗?经理将不知道此片段,您可能还需要使用事务添加第一个
片段

如果(savedInstanceState==null)performFirstTransaction()
执行,请仔细检查
,否则您将两次添加第一个
片段

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

见此:

作为旁注,不建议对
片段使用自定义构造函数。这是因为如果你的应用程序被操作系统终止并重新实例化,它将调用空构造函数

您应该使用静态方法,例如
ContentFragment.getInstance()
来创建
片段

有关更多信息,请参见:在“课程概述”部分


我希望我的回答能帮助您找到问题。

似乎对片段事务调用addToBackStack()是不够的,我们必须在按下后退按钮时处理后堆栈的弹出。我将此添加到我的活动中,效果如预期:

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

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

A班(先开)

B类(由A类打开)


我想你应该先添加tobackstack(),然后替换片段……看下面的答案:我确实尝试过,我在我的活动中添加了以下方法,但没有成功。问题是我使用SupportManager而不是Manager吗?我可以看到您链接的问题与ChildFragmentManager有关-我的问题是SupportManager。实际上addToBackStack(null)不适用于Fragment和AppCompativeActivity。然而,它也适用于v4片段和AppCompatActivity(已验证),我没有为我的片段定制构造函数-我没有更改它。不过,我在片段中有一个方法作为视图更新程序。好的,我从管理器发布了日志链接。这可以工作,但它不会重放动画。编辑:如果要在popbackstack上播放动画,请在调用setCustomAnimation时添加两个额外参数。看,这个很好用。令人惊讶的是,我们必须自己处理它,因为我猜文档中说这将自动发生。如果有文档记录,我们过去在没有它的情况下工作,但我最近遇到了同样的问题,这解决了问题…您不需要这样做,如果您的活动从
FragmentActivity
扩展,并且使用getSupportFragmentManager添加事务
getSupportFragmentManager().beginTransaction().addToBackStack()
addToBackStack在执行片段的添加/替换时为我做了什么。“在添加()之前调用addToBackStack(null),而不是在“这正是我的问题所在”。你帮我省去了很多头痛。谢谢
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
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();