导航组件的popBackStack()方法是否会保留片段状态?

3
当我使用新的导航组件从一个片段导航到另一个片段时,可以通过以下方式成功实现:
btn_walk.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_action))

现在,如果我从目标片段弹出后退栈:

findNavController().popBackStack()

那个启动Fragment再次创建了自己,但是状态没有被保存。我一直在寻找如何修复它的方法,但我不确定如何使用Navigation组件中的navigate()函数来进行add操作。请注意保留HTML标签。

enter image description here

这个gif展示了从一个片段到另一个片段的导航,当从目标片段弹出堆栈时,它会重新创建启动该片段的片段而不是保存其状态。
使用fragmenttransaction.add()方法可以维持该片段的实例,即使我弹出了后退栈。
有没有办法在导航组件中做同样的事情?
我也阅读了Navigation Architecture Fragment Reload Problem,但不清楚应该如何解决。
1个回答

2

当Fragment从后堆栈返回时,它们会自动恢复其保存的状态:不管是否使用导航都是如此。看起来问题出在您如何编写Fragment上。

您可以通过打开“不保留活动”选项,按下主屏幕按钮,然后返回到您的应用程序并查看Fragment是否完美地恢复其状态来确认这是与您的Fragment相关的问题。您还可以测试正确处理配置更改的情况(即旋转设备)-同样,您应该能够恢复您之前的状态。如果您处理了这两种情况,那么在导航中也将非常出色。


如果您在保存/恢复其状态方面遇到困难,我强烈建议分别提出问题,如果您有特定的视图等。 - ianhanniballake
感谢Ian,明天会看一下。 - Gastón Saillén
他的问题实际上是合法的。这是一个导航组件的 bug,并且正在这里讨论: https://dev59.com/lVUL5IYBdhLWcg3wV22q#51684125 还有一个错误报告:https://issuetracker.google.com/issues/80029773 - TatiOverflow
@TatiOverflow - 不,那与此问题无关。后退栈中的片段已经正确保存和恢复它们的状态。该问题链接特别是针对不在后退栈中的片段。 - ianhanniballake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接