旋转时恢复嵌套的片段

3
我有一个带片段的活动。片段中的一个下拉菜单决定了下方显示哪个2个片段。这两个片段继承了一个抽象片段。在这些片段中,用户通过输入域输入一些数据。我需要在屏幕旋转后恢复这些数据。如何使用onSaveInstanceState来做到这一点?我不想保留片段或其他任何东西。 代码:
  • In the activity I don't do anything related to rotation or saving the state. I don't override onSaveInstanceState.
  • In the fragment with the spinner

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(SPINNER_SELECTION, selectedPosition);
        outState.putParcelable(FIELDS, getFragmentManager()
            .saveFragmentInstanceState(getFragmentManager()
            .findFragmentById(R.id.container_with_fields)));
    }
    

    In onCreateView I check if (savedInstanceState == null) and restore the fields.

  • In the inner fragments I don't do anything.

错误

目前onSaveInstanceState方法被调用,但是onCreateView方法没被调用。在两者之间,我得到了以下错误,这似乎与我的代码无关:

07-03 10:33:06.079: W/dalvikvm(4286): threadid=1: thread exiting with uncaught exception (group=0x41e26700)
07-03 10:33:06.079: E/AndroidRuntime(4286): FATAL EXCEPTION: main
07-03 10:33:06.079: E/AndroidRuntime(4286): java.lang.NullPointerException
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1599)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1655)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.Activity.onSaveInstanceState(Activity.java:1238)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.Activity.performSaveInstanceState(Activity.java:1186)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1240)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3851)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.ActivityThread.access$800(ActivityThread.java:159)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1322)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.os.Looper.loop(Looper.java:176)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at android.app.ActivityThread.main(ActivityThread.java:5419)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at java.lang.reflect.Method.invokeNative(Native Method)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at java.lang.reflect.Method.invoke(Method.java:525)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
07-03 10:33:06.079: E/AndroidRuntime(4286):     at dalvik.system.NativeStart.main(Native Method)

应用程序没有崩溃,但活动似乎已经完成。旋转后,屏幕会短暂冻结,然后显示父活动。
我已检查并使用项目中的最新SDK和库。
1个回答

1
我发现错误是因为这一行代码:
outState.putParcelable(FIELDS, getFragmentManager()
    .saveFragmentInstanceState(getFragmentManager()
    .findFragmentById(R.id.container_with_fields)));

我仍然无法解释它...

由于某些原因,我无法使用onSaveInstanceState进行保存,但我也读到了使用setRetainInstance要好得多。前者会导致额外的开销,而后者跳过一些方法。因此,我最终保留了外部片段的实例。此外,我添加了属性(成员变量)来存储在片段字段中输入的所有内容。通过这种方式,一旦重新创建片段,我就可以恢复状态。确切地说,我检查我的属性是否已初始化,如果是,则将它们的值放入片段中的字段中。

希望这能帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接