首页 > 解决方案 > 如何删除添加到 FragmentManager 的第一个片段并启动新的 BackStack?

问题描述

所以我决定在我的 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(),然后我继续使用此方法导航应用程序。

但是,我想做的是在用户登录后,我想完全删除所有的后台条目和片段,并从一个干净的状态开始。

这样做的问题是,如果 do popBackStackuntil backStackEntryCount == 0OnboardingFragment则永远不会从堆栈中弹出,因为它一开始就没有添加到堆栈中。在开始时将其添加到 backstack 会导致清理 backstack 的错误,但是如果按 Back 或 Up,您将看到一个空视图。

我试过做remove(OnboardingFragment()),但这也不起作用,add(R.id.container, Fragment())在它上面做也不起作用,因为它的 UI 仍然在新 UI 之下。甚至 hide() 也没有用。为什么会发生这种情况?

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

标签: androidandroid-fragmentsfragment-backstack

解决方案


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

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();

推荐阅读