【发布时间】:2018-06-09 00:39:32
【问题描述】:
所以我决定在我的 Single Activity,Multiple Fragments 宠物项目中使用 Fragment backstack,但我从一开始就遇到了问题。
我的应用流程是这样的 -> Activity 启动,然后这样做:
supportFragmentManager.beginTransaction()
.add(R.id.container, OnboardingFragment.newInstance())
.commit()
第一个片段是 OnboardingFragment,然后用户向前导航到 SignInFragment,我的 Activity 中有这个方法:
fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, fragment)
.addToBackStack(null)
.commit()
}
我用这个方法启动SignInFragment(),之后我继续用这个方法来导航应用程序。
但是,我想做的是在用户登录后,我想完全删除所有的 backstack 条目和 Fragments,并从头开始。
这样的问题是如果在backStackEntryCount == 0 之前执行popBackStack,OnboardingFragment 永远不会从堆栈中弹出,因为它一开始就没有被添加到堆栈中。一开始将它添加到 backstack 会导致 backstack 被清除的错误,但是如果按 Back 或 Up,您将看到一个空视图。
我尝试做remove(OnboardingFragment()),但这也不起作用,在它上面做add(R.id.container, Fragment()) 也不起作用,因为它的 UI 仍然在新 UI 之下。甚至 hide() 也没有用。为什么会发生这种情况?
TLDR;如果添加到容器中的第一个片段不在后堆栈上,如何删除它?
【问题讨论】:
-
也许更好的方法是保留凭据
Fragments,例如sign in和sign up坚持一个Actvity。比用户成功创建帐户或登录休息Fragments坚持另一个Activity。在登录或注册后,您可以通过明确的BackStack开始全新的Activity -
是的,我也想过这个问题,但我想知道是否还有一种方法可以在单个
Activity流中实现。我想这是唯一的方法? -
您可以通过
loop到BackStackEntryCount()和每次迭代调用popBackStack。 -
这就是我正在做的事情,但第一个
Fragment不在后台,因此无法以这种方式删除。
标签: android android-fragments fragment-backstack