【问题标题】:Fragment's onSaveInstanceState() is never called片段的 onSaveInstanceState() 永远不会被调用
【发布时间】:2011-12-14 11:19:50
【问题描述】:

我正在尝试将数据保存在 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吗?我刚刚检查以确保我拥有最新的支持包,并意识到我正在使用 actionbar sherlock。我确实更新了最新的 ABS,但我仍然遇到问题。不确定 ABS 是否是罪魁祸首?
  • 我刚刚尝试了 Mark Murphy 的 EU4You (github.com/commonsguy/cw-android/tree/master/Fragments/EU4You_6) 与普通支持库以及 ActionBarSherlock。在这两种情况下,它都调用了 onSaveInstanceState 并将包传递给 onActivityCreated。所以,还是要查明原因。

标签: android android-fragments


【解决方案1】:

至少在我的情况下,我终于找到了问题所在。我的 FragmentActivity 中有一个被覆盖的 onSaveInstanceState,它没有调用 super.onSaveInstanceState(Bundle outState)。一旦我添加了它,Fragment.onSaveInstanceState(Bundle outState) 就可以正常运行了。

【讨论】:

  • 嘿嘿嘿...这也是 EU4You_6 中的一个错误。感谢您发布此消息!
  • 对不起,我发现这个答案是正确的,但你能解释一下这个答案吗,我也面临这个问题,非常感谢
  • @famfamfam 你不明白怎么能找到“这个答案是真的”?
【解决方案2】:

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

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

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

【讨论】:

  • 确实如此。在托管它的活动需要保存其状态之前,不会调用 Fragment.onSaveInstanceState,如下所述:developer.android.com/reference/android/app/…
  • 那如果要保存当前fragment中的数据怎么办?
  • @benleung,我想使用一个与片段相比具有独立生命周期的对象来保存数据。例如,单例数据管理器、粘性服务,甚至 SharedPreferences 或文件,由于开销,最后两个可能不是最佳选择。
  • @Zephyr 您的建议可能不适合我的情况,当我换出和换回片段时,我真的想要相同的数据集。但如果活动和片段是新创建的,我更喜欢一组新数据。这两种情况似乎很难区分。
  • 您可以使用 onStop 和 onResume 回调(片段,而不是活动)。即使您在同一活动的片段之间切换,这两个也可以工作。如果您的应用程序进入后台,则会调用 onSaveInstanceState 和 onRestoreInstanceState 以便您可以使用它们。如果在某些情况下没有调用它们,您实际上可能会使用方法 setArguments() 传递一些信息,并且即使您的应用程序在后台并且您需要再次重新创建片段,这些信息也应该保留。如果您不需要此功能,只需将数据存储为常规字段即可。
【解决方案3】:

在某些情况下,您可能会发现使用 片段参数 而不是 savedInstanceState 会有所帮助。 Further explanation.

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      尝试在活动中调用FragmentManager#saveFragmentInstanceStateFragment#setInitialSavedState。 您调用 saveFragmentInstanceState,然后框架将调用 onSaveInstanceState。然后你调用 setInitialSavedState,然后框架将调用 onCreateView,不带空参数 'Bundle savedInstanceState'。

      【讨论】:

        【解决方案6】:

        尝试在onCreate(Bundle savedInstanceState) 中调用setRetainInstance(true)

        【讨论】:

        • 您希望何时调用onSaveInstanceState?也许你只是没有正确触发它。
        • 我希望在离开 Activity 时调用它,以便在返回时保存一些数据。对吗?
        • 这是一种完全不同的跨实例片段状态持久性方法:developer.android.com/reference/android/app/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 2012-10-27
        • 2013-10-12
        • 2012-03-27
        • 2013-08-29
        • 2013-11-03
        相关资源
        最近更新 更多