在支持横向和纵向方向的不同布局时使用savedInstanceState

时间:2017-11-11 12:31:20

标签: android

我有一个Android应用程序,当屏幕宽度较小时使用单窗格视图,当屏幕有足够宽度时使用双窗格视图。

我最近升级到了android sdk版本26​​,当我更改屏幕方向时,我的应用程序在onSaveInstanceState()中崩溃并跟随堆栈跟踪,以便应用程序从单一窗格视图转到两个窗格视图。

java.lang.IllegalStateException: Fragment has not been attached yet.
at android.support.v4.app.Fragment.instantiateChildFragmentManager(Fragment.java:2308)
at android.support.v4.app.Fragment.getChildFragmentManager(Fragment.java:773)
at android.support.v4.app.FragmentActivity.markState(FragmentActivity.java:967)
at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:527)
at android.support.v7.app.AppCompatActivity.onSaveInstanceState(AppCompatActivity.java:509)
at com.my.package.MainActivity.onSaveInstanceState(MainActivity.java:144)
at android.app.Activity.performSaveInstanceState(Activity.java:1337)
at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1300)
at android.app.ActivityThread.callCallActivityOnSaveInstanceState(ActivityThread.java:4156)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4118)
at android.app.ActivityThread.access$1000(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5578)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

当我分析问题时,我发现当从一个窗格布局切换到两个窗格布局时,第二个窗格(它是一个片段)的状态将保存在savedInstanceState中,并且片段将再次在{{1单窗格视图,但没有附加到活动,因为单窗格视图没有此片段。当方向再次更改为横向时,sdk会尝试保存此未连接片段的状态,并如上所述崩溃。

要解决此问题,我在onCreate()onSaveInstanceState()中保存了设备的方向,只有当前方向与保存的方向相同时,才会将savedInstanceState传递给onCreate()

我的问题是,当活动使用不同的布局时,这是否是一个安卓漏洞,还是不应该将横向活动的savedInstanceState传递给纵向活动的super.onCreate()

0 个答案:

没有答案