Jon*_*n I 5 java android android-fragments fragmentmanager fragment-backstack
我想要的正确行为是:
Fragment A -> Fragment B -> Fragment C -> Fragment A
Run Code Online (Sandbox Code Playgroud)
我目前所做的:
popBackStack()still 这里一切顺利。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();
Run Code Online (Sandbox Code Playgroud)
我一直在寻找解决方案,但没有结果,所以请不要将此标记为重复。
提前致谢。
FragmentManager 的返回堆栈仅在两种情况下更新:
addToBackStack()popBackStack()没有其他操作影响返回堆栈 - 附加的 FragmentTransactions 不仅会addToBackStack()更改当前状态,而且不会影响调用时发生的情况popBackStack()等。
如果您希望堆栈从A到A -> B,您可以使用 FragmentTransaction 和addToBackStack(通常是一个replace操作):
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, fragmentB)
.addToBackStack("b")
.commit();
Run Code Online (Sandbox Code Playgroud)
然后,您希望返回堆栈为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();
Run Code Online (Sandbox Code Playgroud)
这可确保您在添加到返回堆栈FragmentB之前从堆栈中删除。FragmentC
同样,如果您想删除FragmentC并返回到FragmentA,只需将其从后退堆栈中弹出即可:
// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)
Run Code Online (Sandbox Code Playgroud)
注意:在同一个 FragmentManager 中混合返回堆栈 FragmentTransactions 和常规 FragmentTransactions 从来都不是一个好主意,因为popBackStack()不考虑 的当前状态FragmentManager,而是只是盲目地反转返回堆栈上的 FragmentTransaction (即最后一个 FragmentTransaction 与addToBackStack()。