从Backstack恢复Fragment时更改EditText值

时间:2018-04-10 15:30:10

标签: android android-fragments android-lifecycle

我有两个碎片:F1和F2

F1包含:

  • 用户可填写的EditText
  • a' next'按钮转到F2

当用户按下' next'时,显示F2并将F1添加到backstack。因此,当用户按下F2时,它返回F1。

当用户返回F1时,我想重置EditText中的值。由于我只想在重新创建视图时重新初始化该值,因此我重置了onViewCreated而不是onResume中的值。

我遇到的问题是,当用户在尝试恢复之前状态的片段时按下后,系统会自动填充EditText。 该值会自onViewStateRestoredsaveInstanceState捆绑包中自动重新填充。

所以我的问题是:覆盖onViewStateRestored方法以将空包发送到超级(见下文)是一个好主意,因为它解决了我的问题?

@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(null);
}

2 个答案:

答案 0 :(得分:1)

  

所以我的问题是:覆盖onViewStateRestored方法以将空包发送到super(见下文)是一个好主意,因为它解决了我的问题?

答案很可能是否定的。这种“小”黑客通常会在未来导致巨大的WTF和长时间的调试。

例如,如果我没有弄错的话,这个hack会立即导致配置更改和保存和恢复流的上下文中的错误。由于在这两个流程中片段的View将被重新创建,因此您将丢失用户的输入。

最有可能的是,这不是你想要的行为。

我在评论中阅读了您的讨论,但仍然无法理解为什么您坚持要求在重新创建片段EditText时清除View

如果用户返回此片段,您希望此EditText为空,对吗?然后,恕我直言,最好的解决方案是在转换到F2之前单击“下一步”按钮时将其清除。

答案 1 :(得分:1)

面临同样的问题。

我是如何解决的:

  1. setSaveEnabled(false);用于编辑文本。

  2. 创建了一个 Singlton 模型类

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

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

可能有一些更优化的溶胶可用,所以请大家在评论中提出建议。