【问题标题】:How to remove the first fragment added to the FragmentManager and start a fresh BackStack?如何删除添加到 FragmentManager 的第一个片段并启动新的 BackStack?
【发布时间】: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


【解决方案1】:

如果添加到容器中的第一个片段不在后堆栈上,我如何删除它?

FragmentManager fragmentManager = getSupportFragmentManager();

//for adding the first fragment, save a reference to it
Fragment fragment = new Fragment();
fragmentManager.beginTransaction().add(R.id.fragment_container, fragment).commit();

//for removing the first fragment
fragmentManager.beginTransaction().remove(fragment).commit();

或者您可以在不保存对您的第一个片段的引用的情况下通过以下代码行来做到这一点:

fragmentManager.beginTransaction().remove(fragmentManager.findFragmentById(R.id.fragment_container)).commit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多