我想要的正确行为是:
Fragment A -> Fragment B -> Fragment C -> Fragment A
我目前正在做什么:
popBackStack()
一切顺利。 popBackStack()
,但BackStackEntryCount仍将包含
B的条目。我真的需要将backStackEntryCount
与管理器中包含的片段相同。
有人知道我在做什么错吗?
我的代码:
Fragment fragment1 = fragmentManager.findFragmentByTag("NavigationFragment_");
if (fragment1 != null) {
fragmentManager.beginTransaction()
.setTransition(TRANSIT_FRAGMENT_FADE)
.remove(fragment1)
.commit();
}
fragmentManager.beginTransaction()
.addToBackStack(backstack)
.setTransition(TRANSIT_FRAGMENT_OPEN)
//.remove(getFragmentManager().findFragmentByTag(NavigationFragment_.class.getSimpleName()))
.add(R.id.fragmentContainer, fragment, fragment.getClass().getSimpleName())
.commit();
一段时间以来,我一直在寻找解决方案,但没有结果,因此请不要将其标记为重复。
谢谢。
答案 0 :(得分:0)
仅在以下两种情况下更新FragmentManager的后堆栈:
addToBackStack()
popBackStack()
没有其他操作会影响后堆栈-没有addToBackStack()
的其他FragmentTransactions仅会更改当前状态,并且不会影响调用popBackStack()
等时发生的情况。
如果您希望堆栈从A
到A -> B
,则可以将FragmentTransaction与addToBackStack
(通常是replace
操作)一起使用:>
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, fragmentB)
.addToBackStack("b")
.commit();
然后,您希望将后退堆栈从A -> B
到A -> C
,需要执行两项操作:
// First pop B
fragmentManager.popBackStack("b", FragmentManager.POP_BACK_STACK_INCLUSIVE)
// Then addToBackStack C
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, fragmentC)
.addToBackStack("c")
.commit();
这可确保在将FragmentB
添加到后置堆栈之前,先从堆栈中删除FragmentC
。
类似地,如果您要删除FragmentC
并返回到FragmentA
,则只需从后堆栈中弹出它即可:
// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)
注意:在同一FragmentManager中混合使用堆栈FragmentTransactions和常规FragmentTransactions绝不是一个好主意,因为popBackStack()
不考虑FragmentManager
的当前状态,而只是盲目地反转堆栈上的FragmentTransaction(即最后一个带有addToBackStack()
的FragmentTransaction。
答案 1 :(得分:0)
如果您因为调用popBackStack()而来到这里,但getBackStackEntryCount()似乎没有更新,那么您可能想尝试popBackStackImmediate()。
popBackStack()是异步的-它使弹出请求入队,但是直到应用程序返回其事件循环时才执行该操作。