【发布时间】: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