所以,也有一些类似的问题,但是我没有找到一个解决这个问题的方法。
official android documentation看起来很直观,但是当我用更复杂的工作流实现一个应用程序时,片段backbackback就会变得杂乱无章,奇怪的事情开始发生。我开发了一个简单应用程序的框架,其中包含了一个活动的概念,它的片段可以访问该活动来启动其他片段。我就是这样做的:
1-我让我的主活动实现一个名为“fragmentdelegate”的接口

public interface FragmentDelegate {
    public void startFragment(CCFragment fragment, boolean addToBackStack);
}

2-StartFragment方法的实现:
@Override
public void startFragment(CCFragment fragment, boolean addToBackStack) {

    FragmentManager fragmentManager = getSupportFragmentManager();

    fragment.setFragmentDelegate(this);
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    fragmentTransaction.setCustomAnimations(R.anim.slide_in_right,
            R.anim.slide_out_left, R.anim.slide_in_left,
            R.anim.slide_out_right);

    fragmentTransaction.replace(CONTENT_VIEW_ID, fragment,
            "callerFragmentClassName");
    if (addToBackStack)
        fragmentTransaction.addToBackStack("callerFragmentClassName");
    fragmentTransaction.commitAllowingStateLoss();

}

最酷的是,我可以从任何片段中调用:
mFragmentDelegate.startFragment(aNewFragment, addToBackStack);

好,现在想想下面的情况:
我从一个初始片段开始我的活动,比方说片段A。
从片段A中,我调用相机活动以获得结果。当结果到达时,我启动片段b(将a添加到backback)。从b开始,我开始片段c,而不向backback添加b。所以我们在后面有这个:
[甲][丙]
如果我按后退按钮,我会回到A。
如果我重复这个过程,back back就会出错,当我按下back时,它会一次又一次地把我带到c片段……
我知道这很难理解(对我来说更难解释,因为英语不是我的母语),但是如果有人能向我解释一下android片段backbackback是如何工作的,或者为一个应用程序提供某种框架,那就太好了。

最佳答案

说明:
当fragmentmanager恢复保存的fragmenttransaction s时(例如,用户单击back按钮或对其调用某个pop方法),它将执行与保存的fragmenttransaction中存储的操作相反的操作。您可以看到准确的代码here,非常简单。
在您的例子中,保存的操作类型是'replace',因此还原意味着删除所有添加的片段实例并重新添加删除的片段实例。所以当你有这样一个片段堆栈时:
[甲][乙]
fragmentmanager知道,那就是必须删除[b]片段实例,并在pop操作上添加[a]。问题是,你用[C]代替了[B]:
[甲][丙]
不幸的是,保存的片段backbackback条目不知道[c]。所以在pop操作中,fragmentmanager将重新添加[a],找不到[b],所以它对此不做任何操作,而将[c]留在原地。
解决方案
这个问题的一个可能的解决方案是使用子片段。fragment-a是一个顶级片段,但是fragment-b和fragment-c是wrapperfragment的子片段。
基本上,当您导航到fragment-b时,您可以在保存的事务中将fragment-a替换为wrapperfragment:
[甲][[乙]]
之后,当用户导航到fragment-c时,只需将wrapperfragment的[b]替换为[c]:
[甲][[丙]]
当用户按下后退按钮时,我们将正确返回片段-a:
[A]
演示
我组装了一个GitHub project来演示这项技术。

10-07 18:59
查看更多