如何删除中间的片段事务

时间:2016-07-15 06:47:47

标签: android android-fragments

我有5个片段(比如A,B,C,D,E)和一个带容器的活动。 每当我想要将一个片段添加到容器中时,我将使用以下代码。

getSupportFragmentManager().beginTransaction().replace(R.id.mainContainerRL, fragment, tag).addToBackStack(tag).commit();

假设我添加了片段A. 在A中做了一些动作后,我添加了片段B. 在B中做了一些动作后,我添加了片段C. 在C中执行某些操作后,我添加了片段D. 在D中执行某些操作后,我添加了片段E。

现在我的堆栈应如下所示。 A - > B - > C - > D - > ë

现在在片段E中执行某些操作后,我需要删除片段D,C,B,这样当用户单击时,他应该直接看到片段A。

我尝试使用以下代码。

public void removeScreen(@NonNull String tag) {
    FragmentManager manager = getSupportFragmentManager();
    Fragment fragment = manager.findFragmentByTag(tag);
    if (fragment != null) {
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove(fragment);
        trans.commitAllowingStateLoss();
    }
}

在片段E中执行某些操作后,我使用片段D,C,B调用上述函数(标签与我用于片段事务的标签相同)。

现在,当我点击后退按钮时,片段D变得可见,但我期待片段A。

如果有人指出我哪里出错了会很有帮助。

3 个答案:

答案 0 :(得分:1)

如果您希望达到与您所描述的完全相同的行为,您可以通过以下方式实现:

FragmentManager manager = getSupportFragmentManager();
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

这将清除所有后台堆叠,直到达到堆栈底部。

答案 1 :(得分:0)

出于这个原因,我更喜欢使用DialogFragment,并使用界面回调和dismiss()函数弹出它们。这是实现您要执行的操作的最简单快捷的方法。

答案 2 :(得分:0)

我认为你的问题出现在这里:

替换:

getSupportFragmentManager().beginTransaction().replace(R.id.mainContainerRL, fragment, tag).addToBackStack(tag).commit();

为:

getSupportFragmentManager().beginTransaction().add(R.id.mainContainerRL, fragment, tag).addToBackStack(tag).commit();

当你将片段添加到容器时,只需添加它,如果使用"替换"方法,你可以从activirty的fagment经理那里得到它,例如你的" removeScreen"方法不起作用

相关问题