永远不会调用Fragment的onSaveInstanceState()

jul*_*jul 64 android android-fragments

我正在尝试将数据保存在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
    }

}
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 68

我终于找到了问题,至少在我的情况下.我的onSaveInstanceStateFragmentActivity中有一个被覆盖但没有调用的东西super.onSaveInstanceState(Bundle outState).一旦我加入,Fragment.onSaveInstanceState(Bundle outState)功能正常.

  • 呵呵呵......这也是EU4You_6中的一个错误.感谢您发布此内容! (7认同)

Zep*_*hyr 33

我遇到了同样的问题,并尝试了onSaveInstanceState()方法,但没有奏效.

我认为onSaveInstanceState()仅适用于用户从一个活动跳转到另一个活动并返回的场景,它不适用于用户在同一活动中的片段之间跳转的场景.

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

  • 确实如此.Fragment.onSaveInstanceState将不会被调用,直到托管它的活动需要保存其状态,如下所示:http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle) (3认同)
  • 那么如果我想将数据保存在当前片段中该怎么办? (2认同)
  • @Zephyr您的建议可能不适合我的情况,当我换出并交换片段时,我真的想要相同的数据集.但如果活动和片段是新创建的,我宁愿选择一组新的数据.似乎很难区分这两种情况. (2认同)
  • 您可以使用onStop和onResume回调(片段的,不是活动的)。即使您在同一活动的片段之间切换,这两个也可以工作。如果您的应用程序进入后台,则会调用onSaveInstanceState和onRestoreInstanceState以便可以使用它们。如果在某些情况下未调用它们,则实际上可以使用setArguments()方法传递一些信息,即使您的应用程序在后台,并且您需要再次重新创建该片段,该信息也应保留。如果不需要此功能,只需将数据存储为常规字段即可。 (2认同)

Sco*_*ott 6

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


Fyo*_*yok 6

在某些情况下,您可能会发现使用片段参数而不是savedInstanceState.进一步说明.