android - 为什么我的片段仍然被添加到后台堆栈?
问题描述
我正在尝试将我的应用程序的一部分迁移到单个活动,并且我有两种片段:我希望用户能够返回的片段,以及我只是“临时”屏幕的片段不希望用户能够返回。
我以为我可以为此使用后台堆栈,但它不起作用。
对于我使用的第一个:
supportFragmentManager.commit {
replace(binding.fragmentContainer.id, MyFragment(), MyFragment.TAG)
addToBackStack(MyFragment.TAG)
}
对于第二个(“临时”屏幕),我使用:
supportFragmentManager.commit {
replace(binding.fragmentContainer.id, MyFragment())
}
当我检查时,supportFragmentManager.mBackStack
我可以看到 backstack 已按预期设置,但似乎无关紧要,何时onBackPressed
调用,用户可以返回到不在 backstack 上的片段。
所以我试图onBackPressed
像这样覆盖:
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 1)
supportFragmentManager.popBackStack()
}
但它似乎也不起作用。
编辑:要清楚,我在我的 Activity 中有一个FragmentContainerView
命名fragmentContainer
,并使用我提供的第一个代码示例添加第一个片段,然后我使用第二个代码示例添加第二个片段,然后使用第一个代码示例添加第三个片段。我的 backstack 看起来像这样:
- 我的第一个片段
- 我的第三个片段
“MySecondFragment”没有按预期添加到后台,它看起来与我想要的完全一样,但是当我执行 a 时popBackstack
,我不会回到 MyFirstFragment 而是回到 MySecondFragment,原因不明。
解决方案
如果您要替换 Activity 之上的片段,则显然意味着该 Activity 只有一个片段。所以理想情况下,backstack 计数应该为 0。在这种情况下,您的检查逻辑不正确。而不是 if (supportFragmentManager.backStackEntryCount > 1),它应该是 if (supportFragmentManager.backStackEntryCount > 0)
希望它有效。
推荐阅读
- python - 使用带有 EMR 的 AWS Lambda 从字符串中获取 JSON 对象
- javascript - 如何抓取使用 javascript 的网页?
- vb.net - '找不到名为 Brand_ID 的列。参数名称:columnName'
- solr - Spring Data Solr - 支持本机(不是“匿名”或“未标记”)嵌套/子文档?
- android - 共享偏好的 Mockito 单元测试
- android - NetworkImageView 总是抛出 NullPointerException cache.get(url) 从有效 URL 访问图像时不能为 null
- django - 大家好,我一直在尝试为 django 激活我的文件夹,但它只一直显示这个,任何人都可以帮助我
- kotlin - 协程中“this”的类型
- mysql - MySQL简单查询以提取给定2个分隔符的子字符串
- javascript - 是否可以在 Yup 中定义何时在现场进行验证?