Android 无需轻弹即可管理碎片回退流 我已经创建了一个AppCompatActivity打开的片段A->B->C->D->E->F 替换为 当我按下按钮时,我在包含按钮的F上 按钮,我想清除C上的片段,并想在C上打开G,这样新的序列将是A->B->C->G。我可以用它来完成 popbackbackimmediate()并使用replace函数将G添加到C的顶部

Android 无需轻弹即可管理碎片回退流 我已经创建了一个AppCompatActivity打开的片段A->B->C->D->E->F 替换为 当我按下按钮时,我在包含按钮的F上 按钮,我想清除C上的片段,并想在C上打开G,这样新的序列将是A->B->C->G。我可以用它来完成 popbackbackimmediate()并使用replace函数将G添加到C的顶部,android,android-fragments,fragment-backstack,fragmentmanager,Android,Android Fragments,Fragment Backstack,Fragmentmanager,问题:当我按下按钮时,我在几秒钟内看到C,然后G显示在上面。为了防止出现这种情况,我尝试在C的帮助下停止动画,但即使动画因片段而停止,C在几秒钟内仍然可见 在替换C上的片段时,有没有更好的方法来设计片段流或解决此flicks的方法?更通用的解决方案对于此类导航流,请像这样替换片段 getSupportFragmentManager().beginTransaction(). replace(R.id.f_container,new FragmentA())

问题:当我按下按钮时,我在几秒钟内看到C,然后G显示在上面。为了防止出现这种情况,我尝试在C的帮助下停止动画,但即使动画因片段而停止,C在几秒钟内仍然可见


在替换C上的片段时,有没有更好的方法来设计片段流或解决此flicks的方法?

更通用的解决方案对于此类导航流,请像这样替换片段

getSupportFragmentManager().beginTransaction().
                  replace(R.id.f_container,new FragmentA())
                    .addToBackStack("A")
                    .commit();
getSupportFragmentManager().beginTransaction().
                  replace(R.id.f_container,new FragmentB())
                    .addToBackStack("B")
                    .commit();
像wise一样,直到片段F,让我们假设您在F上有submit按钮 现在,点击提交按钮

使用如下所示的Pop_back_stack_INCLUSIVE标志将堆栈向后弹出到D,并使用片段G添加替换容器

getActivity().getSupportFragmentManager().popBackStack("D",
FragmentManager.POP_BACK_STACK_INCLUSIVE);
getSupportFragmentManager().beginTransaction().
                      replace(R.id.f_container,new FragmentG())
                        .addToBackStack("G")
                        .commit();
现在当你们按下后退按钮,你们会看到片段C


我希望这将对您有所帮助,它对我很有用

我对这个问题非常好奇,所以我创建了一个示例项目,并实现了您在问题中提到的相同用例。我是这样处理的

使用此方法从backstack中删除F、E、D片段

private void removeFragments() {
    getSupportFragmentManager().popBackStack("F", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    getSupportFragmentManager().popBackStack("E", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    getSupportFragmentManager().popBackStack("D", FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
使用此方法替换片段

private void replaceNewFragment(String key) {
    getSupportFragmentManager().beginTransaction().addToBackStack(key)
            .replace(android.R.id.content, AFragment.newInstance(key)).commit();
}
这是一个视频演示。


这是关于

的这个项目的全部内容,我最近一直在努力想办法解决这个问题。在我看来,禁用动画只会禁用事务动画,而不会禁用事务本身。我认为先替换片段,然后清除backbackback就可以了!!嘿,你试过下面的答案了吗,还是仍然面临这个问题?我的意见是:第一个活动中的A、B、C,然后是第二个活动中的D、E、F、G,当达到C时,你可以立即弹出BackbackImmediate(),如果仍然需要C,或者在开始第二个活动后完成第一个活动这对我很有用。诀窍是使用popBackStack()而不是popBackStackImmediate(),并将所有内容捆绑在一个“提交”中,就像44kksharma建议的那样。是的,技巧是popBackStack而不是popBackStack Immediate,但问题是,当我们使用popBackStack时,它会播放动画,如果我们在显示片段G时将幻灯片动画设置为片段C的pop动画,这看起来很奇怪。