android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1576)

这个是Android的一个BUG:

①当你按Home键的时候

②当你屏幕旋转的时候

③当你从FragmentActivit跳到Activity中的时候

这三种情况都会引起该异常。


原因:

stackoverflow上的大神在Android源代码中找到这样一段代码,如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if (f.mSavedViewState != null) {  
  2.     if (result == null) {  
  3.         result = new Bundle();  
  4.     }  
  5.     result.putSparseParcelableArray(  
  6.             FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState);  
  7. }  
  8. if (!f.mUserVisibleHint) {  
  9.     // Only add this if it's not the default value  
  10.     result.putBoolean(FragmentManagerImpl.USER_VISIBLE_HINT_TAG, f.mUserVisibleHint);  
  11. }  
此段代码经过修改如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if (f.mSavedViewState != null) {  
  2.     if (result == null) {  
  3.         result = new Bundle();  
  4.     }  
  5.     result.putSparseParcelableArray(  
  6.             FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState);  
  7. }  
  8. if (!f.mUserVisibleHint) {  
  9.     if (result == null) {  
  10.         result = new Bundle();  
  11.     }  
  12.     // Only add this if it's not the default value  
  13.     result.putBoolean(FragmentManagerImpl.USER_VISIBLE_HINT_TAG, f.mUserVisibleHint);  
  14. }  

解决方法:(全是到stackoverflow,谷歌代码找到的)

①重写onSaveInstanceState(Bundle outState),在该函数中不再调用super.onSaveInstanceState().(这种方法可以避免异常,仅仅是权宜之计,并不合理,不推荐使用该种方法)。

②重写onSaveInstanceState(Bundle outState),再调用super.onSaveInstanceState()之前,添加这样一句代码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. setUserVisibleHint(true);  
这样可以避免程序崩溃(不知道为什么,有知道的大神,望告之)。

③在上面的大神已经给出了原因。因此为了不让result为null。重写onSaveInstanceState(Bundle outState),在调用super.onSaveInstanceState()之前,给outState添加一些内容即可。比如:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. outState.putString("WORKAROUND_FOR_BUG_19917_KEY""WORKAROUND_FOR_BUG_19917_VALUE");  



参考:

http://stackoverflow.com/questions/8748064/starting-activity-from-fragment-causes-nullpointerexception

https://code.google.com/p/android/issues/detail?id=19917


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值