fragmentManager.getBackStackEntryCount() 从管理器中删除片段时不会减少
fragmentManager.getBackStackEntryCount() does not decrease when removing fragment from manager
我想要的正确行为是:
Fragment A -> Fragment B -> Fragment C -> Fragment A
我目前在做什么:
- 当我想从B回到A时,我用
popBackStack()
还在这里
一切顺利。
- 当我想从 B 转到 C 时,我删除 B 并
添加 C.(片段数 2,backStackEntryCount 数 3,替换相同)。
- 当我想从C回到A时,我可以使用
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();
我一直在寻找解决方案,但没有结果,所以请不要将其标记为重复。
提前致谢。
FragmentManager 的返回堆栈仅在两种情况下更新:
- 您使用
addToBackStack()
提交了一个 FragmentTransaction
- 你打电话给
popBackStack()
没有其他操作会影响返回堆栈 - 没有 addToBackStack()
的其他 FragmentTransactions 只会更改当前状态,不会影响调用 popBackStack()
等时发生的情况
如果您希望您的堆栈从 A
变为 A -> B
,您将使用带有 addToBackStack
的 FragmentTransaction(通常是 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();
这可确保在将 FragmentC
添加到返回堆栈之前从堆栈中删除您的 FragmentB
。
同样,如果你想删除 FragmentC
并返回到 FragmentA
,你只需将其从后栈中弹出即可:
// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)
注意:在同一个 FragmentManager 中混合返回堆栈 FragmentTransactions 和常规 FragmentTransactions 从来都不是一个好主意,因为 popBackStack()
没有考虑 FragmentManager
的当前状态,而只是盲目地反转返回堆栈上的 FragmentTransaction(即最后一个带有 addToBackStack()
.
的 FragmentTransaction
如果您来这里是因为您调用了 popBackStack() 但 getBackStackEntryCount() 似乎没有更新,那么您可能想试试 popBackStackImmediate()。
popBackStack() 是异步的——它将请求排队以弹出,但直到应用程序 returns 进入其事件循环后才会执行操作。
我想要的正确行为是:
Fragment A -> Fragment B -> Fragment C -> Fragment A
我目前在做什么:
- 当我想从B回到A时,我用
popBackStack()
还在这里 一切顺利。 - 当我想从 B 转到 C 时,我删除 B 并 添加 C.(片段数 2,backStackEntryCount 数 3,替换相同)。
- 当我想从C回到A时,我可以使用
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();
我一直在寻找解决方案,但没有结果,所以请不要将其标记为重复。
提前致谢。
FragmentManager 的返回堆栈仅在两种情况下更新:
- 您使用
addToBackStack()
提交了一个 FragmentTransaction
- 你打电话给
popBackStack()
没有其他操作会影响返回堆栈 - 没有 addToBackStack()
的其他 FragmentTransactions 只会更改当前状态,不会影响调用 popBackStack()
等时发生的情况
如果您希望您的堆栈从 A
变为 A -> B
,您将使用带有 addToBackStack
的 FragmentTransaction(通常是 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();
这可确保在将 FragmentC
添加到返回堆栈之前从堆栈中删除您的 FragmentB
。
同样,如果你想删除 FragmentC
并返回到 FragmentA
,你只需将其从后栈中弹出即可:
// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)
注意:在同一个 FragmentManager 中混合返回堆栈 FragmentTransactions 和常规 FragmentTransactions 从来都不是一个好主意,因为 popBackStack()
没有考虑 FragmentManager
的当前状态,而只是盲目地反转返回堆栈上的 FragmentTransaction(即最后一个带有 addToBackStack()
.
如果您来这里是因为您调用了 popBackStack() 但 getBackStackEntryCount() 似乎没有更新,那么您可能想试试 popBackStackImmediate()。
popBackStack() 是异步的——它将请求排队以弹出,但直到应用程序 returns 进入其事件循环后才会执行操作。