从后台恢复片段时更改EditText的值

3
我有两个Fragment:F1 和 F2。
F1 包含:
- 一个 EditText,用户可以填写 - 一个“下一步”按钮,用于进入 F2
当用户按下“下一步”时,显示 F2 并将 F1 添加到后退栈。因此,当用户在 F2 上按下返回键时,它会返回到 F1。
当用户返回到 F1 时,我希望重置 EditText 中的值。由于我只想在视图被重新创建时重新初始化该值,因此我在 onCreateView 方法中进行了重置,而不是 onResume 方法中。
我的问题是,当用户按下返回键时,EditText 会自动填充为先前保存的状态。在 onViewStateRestored 方法中,值会从 saveInstanceState bundle 自动复原。
所以我的问题是:覆盖 onViewStateRestored 方法并向 super 发送 null bundle 是否是个好主意(如下所示),这样可以解决我的问题?
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(null);
}

我在onViewCreated中重置了值,而不是在onResume中。为什么这样做?如果你想在F1显示时重置值,你应该在onPause()或onResume()中重置EditText。 - vincrichaud
这只是一个非常基本的例子,但我的项目更加复杂,我不想在 onResume 时重置整个 UI,因为它并不必要,因为它没有被销毁。但是当 UI 从头开始重新创建时(仅在 Fragment 从后堆栈中恢复时发生),我希望视图被重置。 - Eselfar
根据片段生命周期,当您打开F2时,您的视图不会被销毁,而是仅停止了片段。因此,您应该将代码放在onStart()或onResume()中。 - vincrichaud
1
如果您查看来自链接的“片段生命周期图2”,您会发现当片段添加到后堆栈时将调用onDestroyView,并在恢复时再次调用onCreateView。顺便说一下,这个方案还没有显示对“onViewStateRestored”的调用,这就是为什么我通常更喜欢这个方案,即使不是来自官方文档也是如此。 - Eselfar
我想在onViewCreated中初始化UI,这意味着只有当视图正确创建时才能进行。所以,是的,我只想覆盖onViewStateRestored以跳过它。我不想在这个方法中写更多的内容,就像上面的示例一样。 - Eselfar
显示剩余6条评论
2个回答

1

遇到相同的问题。

我的解决方法:

  1. 对于编辑文本,使用setSaveEnabled(false)。

  2. 创建一个单例模型类。

  3. 一旦我移动到下一个片段,就将数据保存在单例模型中。

  4. 从模型中设置数据到编辑文本的CreateView中。

可能还有更优化的解决方案,请大家在评论中提出建议。


对我有用,谢谢! - Anupreet Kaur

1
所以我的问题是:覆盖onViewStateRestored方法发送一个null bundle给super,这样做是否是个好主意,因为它解决了我的问题?
答案很可能是否定的。这种“小”hack通常会导致未来的大量 WTF 和长时间的调试会话。
例如,如果我没有弄错的话,这种 hack 将立即导致配置更改和保存和还原流程中的 bug。由于在这两个流程中 fragment 的 View 将被重新创建,您将丢失用户的输入。
最有可能,这不是您想要的行为。
我读了您在评论中的讨论,仍然无法理解为什么您坚持将EditText的清除条件设置为重新创建fragment的View。
您希望这个EditText在用户返回到这个fragment时为空,对吧?那么,在转换到F2之前,IMHO,最好的解决方案是在单击“下一步”按钮时将其清除。

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