我有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。
如果有人指出我哪里出错了会很有帮助。
答案 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"方法不起作用