@Override
protected void onSaveInstanceState(Bundle outState) {
//No call for super(). Bug on API Level > 11.
}
不要打电话给super()
on the saveInstanceState
方法。这把事情搞砸了...
经过更多研究,这是支持包中的一个已知错误。
如果您需要保存实例,并向您的实例添加一些内容outState
Bundle
您可以使用以下内容:
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
super.onSaveInstanceState(outState);
}
最后,正确的解决方案是(如评论中所示)使用:
transaction.commitAllowingStateLoss();
当添加或执行FragmentTransaction
这导致了Exception
.
据我所知,上述解决方案修复了早期 support.v4 库中的问题。但如果您仍然有问题,您还必须阅读@亚历克斯洛克伍德 https://stackoverflow.com/users/844882/alex-lockwood的博客:片段事务和活动状态丢失 http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
博客文章摘要(但我强烈建议您阅读):
NEVER commit()
之后的交易onPause()
在蜂巢之前,并且onStop()
后蜂窝
在内部提交交易时要小心Activity
生命周期方法。使用onCreate()
, onResumeFragments()
and onPostResume()
避免在异步回调方法内执行事务
使用commitAllowingStateLoss()
仅作为最后的手段
Updated: 用于显示DialogFragment
使用 stateLoss 使用以下行。
DialogFragment loadingDialog = createDialog();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(loadingDialog, "loading");
transaction.commitAllowingStateLoss();