【问题标题】:Change EditText value when Fragment is restored from backstack从后台堆栈恢复 Fragment 时更改 EditText 值
【发布时间】:2018-04-10 15:30:09
【问题描述】:

我有两个片段:F1 和 F2

F1 包含:

  • 用户可以填写的 EditText
  • “下一步”按钮转到 F2

当用户按下“下一步”时,会显示 F2 并将 F1 添加到后台堆栈。因此,当用户按下 F2 时,它会返回到 F1。

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

我遇到的问题是,当用户在尝试将 Fragment 恢复到以前的状态时按下返回时,系统会自动填充 EditText。 该值会自动重新填充到来自saveInstanceState 包的onViewStateRestored 中。

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

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

【问题讨论】:

  • "我在 onViewCreated 中重置了值,而不是在 onResume 中。"为什么要这样做?如果要在显示 F1 时重置值,则应在 onPause() 或 onResume() 中重置 EditText
  • 这是一个非常基本的示例,但我的项目更复杂,我不想在 onResume 上重置整个 UI,因为它没有必要因为它不应该被更改为未销毁。但是我希望在从头开始重新创建 UI 时重置视图(仅当从后台恢复 Fragment 时才会发生这种情况)
  • 根据Fragment Lifecycle,当您打开 F2 时,您的视图不会被破坏。片段刚刚停止。所以你应该把你的代码放在 onStart() 或 onResume()
  • 是的。如果您从链接中查看Figure 2. The lifecycle of a fragment,您可以看到在将片段添加到后台堆栈时调用了onDestroyView,并且在恢复时再次调用了onCreateView。顺便说一句,这个方案没有完成,因为它没有显示对onViewStateRestored 的调用。这就是为什么我通常更喜欢this one,即使不是来自官方文档
  • 有趣的方案,谢谢链接。根据它,您似乎是对的(我不得不承认,这很痛苦.. argh XD)。仍然我不明白为什么你不能把你的代码放在 onStop() ?在我看来,这是正确的地方,因为它就在 StateRestored() 之后。因此,您的视图将全部恢复,您只需修改要更改的视图。

标签: android android-fragments android-lifecycle


【解决方案1】:

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

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

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

很可能,这不是您想要的行为。

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

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

【讨论】:

    【解决方案2】:

    面临同样的问题。

    我是如何解决的:

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

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

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

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

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

    【讨论】:

    • 为我工作谢谢!!
    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多