【问题标题】:Restore nested fragments on rotation在旋转时恢复嵌套片段
【发布时间】:2014-07-03 08:33:04
【问题描述】:

我有一个片段活动。片段中的微调器确定 2 个片段中的哪一个出现在微调器下方。这两个片段继承了一个抽象片段。在片段中,用户在字段中输入一些数据。我需要在屏幕旋转后恢复数据。如何使用onSaveInstanceState 做到这一点?我不想保留碎片或其他东西。

代码

  • 在活动中,我不做任何与旋转或保存状态相关的事情。我不会覆盖onSaveInstanceState
  • 在带有微调器的片段中

    @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)));
    }
    

    onCreateView 我检查if (savedInstanceState == null) 并恢复字段。

  • 在内部片段中我什么都不做。

错误

目前调用的是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)

应用程序没有崩溃,但活动似乎已完成。旋转后,屏幕会很快冻结并显示父 Activity。

我已检查是否已在项目中安装并使用了最新的 SDK 和库。

【问题讨论】:

    标签: android android-fragments screen-rotation savestate android-nested-fragment


    【解决方案1】:

    我发现错误是因为这一行而出现的:

    outState.putParcelable(FIELDS, getFragmentManager()
        .saveFragmentInstanceState(getFragmentManager()
        .findFragmentById(R.id.container_with_fields)));
    

    我还是无法解释...

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

    希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      相关资源
      最近更新 更多