损坏的Android savedInstanceState
场景是这样的,我的Android应用程序被用户点击主页按钮、接听来电、点击通知等放置在后台。因此,他们查看Facebook,播放沥青8,任何可能导致Android操作系统发现它需要更多内存并杀死我的Android应用程序的东西。用户决定要查看我的应用程序,点击图标并点击链接 当应用程序在被操作系统终止后启动时,主活动会被传递一个savedInstanceState,其中包含两个键:android:viewHierarchyState和android:support:fragments。此savedInstanceState被传递给片段并崩溃,说明片段未创建视图:损坏的Android savedInstanceState,android,android-fragments,savestate,Android,Android Fragments,Savestate,场景是这样的,我的Android应用程序被用户点击主页按钮、接听来电、点击通知等放置在后台。因此,他们查看Facebook,播放沥青8,任何可能导致Android操作系统发现它需要更多内存并杀死我的Android应用程序的东西。用户决定要查看我的应用程序,点击图标并点击链接 当应用程序在被操作系统终止后启动时,主活动会被传递一个savedInstanceState,其中包含两个键:android:viewHierarchyState和android:support:fragments。此save
Caused by: java.lang.IllegalStateException: Fragment com.foo.SomeFragment did not create a view.
at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2200)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:300)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:404)
at android.app.Activity.setContentView(Activity.java:2156)
at com.foo.NavigationPage.onCreate(NavigationPage.java:774)
at android.app.Activity.performCreate(Activity.java:5958)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
....
因此,操作系统正在使用它在关闭应用程序时写入的数据savedInstanceState,但由于某种原因,当应用程序在启动时使用它创建自身时,它已损坏
我已尝试在NavigationPage活动中执行此操作:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null)
}
这对移动应用程序启动有效,但如果你的移动应用程序进入后台,你点击图标,你希望它回到你离开的地方。传递null会导致应用程序经历所有的屏幕构建/加载过程,这非常耗时,而不是我们想要的用户体验
关于可能发生的事情或我如何避免这种情况,有什么想法吗?这里已经回答了这个问题: 它的字面意思是: 您需要扭转这种局面:
setContentView(R.layout.main_activity);
super.onCreate(savedInstanceState).
为此:
super.onCreate(savedInstanceState).
setContentView(R.layout.main_activity);
在活动的onCreate
中
对不起,我应该提到我看过这个问题,在我的导航页面中,代码是:super.onCreate(savedInstanceState);setContentView(R.layout.navigation);我也毫不高兴地看了这篇文章:那么
onSaveInstanceState
方法呢?也许它还保存了一个空值?不,我通过调试转储了包,请参见:08-25 17:15:38.205 22849-22849/?D/com.foo.NavigationPage﹕ android:viewHierarchyState是捆绑包08-25 17:15:38.205 22849-22849/?D/com.foo.NavigationPage﹕ 键[0],值[android.view.AbsSavedState]$1@483fabc] 08-25 17:15:38.205 22849-22849/? D/com.foo..导航页面﹕ 键[1],值[android.view.AbsSavedState]$1@483fabc] 08-25 17:15:38.205 22849-22849/? D/com.foo..导航页面﹕ 键[2],值[android.view.AbsSavedState]$1@483fabc] ...