android - 如何删除添加到 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 popBackStack
until backStackEntryCount == 0
,OnboardingFragment
则永远不会从堆栈中弹出,因为它一开始就没有添加到堆栈中。在开始时将其添加到 backstack 会导致清理 backstack 的错误,但是如果按 Back 或 Up,您将看到一个空视图。
我试过做remove(OnboardingFragment())
,但这也不起作用,add(R.id.container, Fragment())
在它上面做也不起作用,因为它的 UI 仍然在新 UI 之下。甚至 hide() 也没有用。为什么会发生这种情况?
TLDR;如果它不在后堆栈上,如何删除添加到容器中的第一个片段?
解决方案
如果它不在后堆栈上,如何删除添加到容器中的第一个片段?
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();
推荐阅读
- javascript - 如何在 Next.js 中使用 tailwind css 构建词云/标签云
- google-sheets - Google Sheet - 如何使用一张表进行 FULL OUTER JOIN?
- html - 在 Bootstrap Column Divs 中保持动态高度
- reactjs - 导航回组件时阻止 API 调用
- authentication - SalesForce OpenID 问题“ErrorCode=No_Openid_Response&ErrorDescription=Bad+response”
- ios - iOS 14 Widgets 具有更强大的配置能力
- javascript - 导入图像文件夹
- python - 只有在熊猫数据框中以数字开头时才添加前导零
- python - pandas to csv - 保留“$”作为格式
- asp.net-mvc-4 - 如何通过网格刷新读取和更新剑道网格页脚模板值