android片段onRestoreInstanceState


120

我是否缺少某些东西或Fragment没有onRestoreInstanceState()方法?如果没有,我该如何实现类似的目标?

Answers:


200

片段没有onRestoreInstanceState方法。

您可以在中获得相同的结果onActivityCreated,它会收到具有已保存实例状态(或null)的捆绑包。

此处检查源代码。


89
那不是一个一致的设计,是吗?
Ehtesh Choudhury

4
这还不需要恢复片段吗?对于配置更改来说很好,但是如果您从某个片段转到某个活动然后又回到该片段,该怎么办?
speedynomads 2013年

1
片段应从头开始属于一个活动,因此,如果保存在片段中,它将保存到父活动。因此,如果您离开该片段(属于某个活动)并返回该片段,则所有值将从父活动中恢复
Shaun

3
onActivityCreated()不是还原片段状态的唯一方法。您可以在onCreate(),onCreateView()或onActivityCreated()期间还原它。 developer.android.com/guide/components/fragments.html
shaby

1
@EhteshChoudhury Android应用程序开发中没有什么是“一致的设计”。一切都搞砸了,一切都“过时了”。
卡兰维尔·辛格

43

我知道,您已经接受了答案,但是您应该阅读有关fragment官方文档,并说(第7节“处理fragment Fragment的生命周期”):

您可以使用捆绑包保留片段的状态,以防活动的进程被杀死,并且在重新创建活动时需要恢复片段的状态。您可以在片段的onSaveInstanceState()回调期间保存状态,并在onCreate(),onCreateView()或onActivityCreated()期间还原状态

所以,你可以使用最适合你:onCreate()onCreateView()onActivityCreated()


29

在片段指南的ListFragment 示例中,您可以找到:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("curChoice", mCurCheckPosition);
}

您可以这样使用:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
        // Restore last state for checked position.
        mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
    }
}

onActivityCreated() 在片段从堆栈返回后被调用。


13

onViewStateRestoredof Fragment等于onRestoreInstanceStateActivity。但是它被称为after onActivityCreated(Bundle)和after onStart()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.