片段的onSaveInstanceState()永远不会被调用


68

我正在尝试将数据保存在Fragment的onSaveInstanceState()中,但从未调用该方法。

有人可以帮忙吗?

public class MyFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ScrollView content = (ScrollView) inflater.inflate(R.layout.content, container, false);
        // More stuff
        return content;
    }

    @Override
    public void onSaveInstanceState(Bundle icicle) {
        // NEVER CALLED
        super.onSaveInstanceState(icicle);
        //More stuff
    }

}

您是否正在使用动作栏夏洛克?我只是检查以确保拥有最新的支持包,并意识到我正在使用actionbar sherlock。我确实更新到了最新的ABS,但仍然有问题。不知道也许是ABS的罪魁祸首吗?
2012年

1
我只是使用正常的支持库以及ActionBarSherlock尝试了Mark Murphy的EU4You(github.com/commonsguy/cw-android/tree/master/Fragments/EU4You_6)。在两种情况下,它都调用onSaveInstanceState并将绑定传递给onActivityCreated。因此,仍然需要找出原因。
詹姆斯

Answers:


69

我终于弄清楚了这个问题,至少就我而言。我的onSaveInstanceStateFragmentActivity中有一个未调用的覆盖super.onSaveInstanceState(Bundle outState)。一旦我添加了,Fragment.onSaveInstanceState(Bundle outState)功能就正常了。


7
呵呵...这也是EU4You_6中的错误。感谢您发布!
CommonsWare 2012年

抱歉,我发现这个答案是正确的,但是您能不能对这个答案做更多的解释,我也正面临这个问题,非常感谢
famfamfam 2015年

1
@famfamfam不了解时如何找到“此答案是正确的”?
令人难以置信的

34

我与您遇到相同的问题,并尝试了onSaveInstanceState()方法,但是没有用。

我认为onSaveInstanceState()仅适用于用户从一个活动跳转到另一活动然后又返回的情况,不适用于用户在同一活动中的片段之间跳转的情况。

这是Google的指导文件。http://developer.android.com/guide/components/tasks-and-back-stack.html#ActivityState


3
确实如此。:Fragment.onSaveInstanceState将不会被调用,直到活动举办,它需要保存其状态为这里所说developer.android.com/reference/android/app/...
佩德罗·安德拉德

2
如果我想将数据保存在当前片段中,该怎么办?
Benleung 2015年

1
@benleung,我想使用一个与片段相比具有独立生命周期的对象来保存数据。例如,单例数据管理器,粘性服务,甚至SharedPreferences或File,由于开销,最后两个可能不是最佳选择。
Zephyr

2
@Zephyr您的建议可能不适合我的情况,当我换出并换回该片段时,我真的想要同一组数据。但是,如果活动和片段是新创建的,我希望使用一组新的数据。似乎很难区分这两种情况。
benleung 2015年

2
您可以使用onStop和onResume回调(该片段的回调,而不是活动的回调)。即使您在同一活动的片段之间切换,这两个也可以工作。如果您的应用程序进入后台,则会调用onSaveInstanceState和onRestoreInstanceState以便可以使用它们。如果在某些情况下未调用它们,则实际上可以使用setArguments()方法传递一些信息,即使您的应用程序在后台,并且您需要再次重新创建该片段,该信息也应保留。如果不需要此功能,只需将数据存储为常规字段即可。
vanomart '16


6

要检查的一件事是通过android:configChanges在AndroidManifest.xml中包含该标志来确保包含该片段的Activity不会阻止重新启动。



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.