fragment:调用popbackstack及commit方法illegalStateException异常解决方法

        当调用popbackstack及commit方法对fragment进行进栈出栈操作时,可能就会出现illegalStateException can not perform this action after onsaveinstancestate异常

该异常出现的条件是在系统检测到activity可能要销毁时会调用onSaveInstanceState对activity的状态进行保存,在状态未恢复时不允许对activity的fragment进行进出栈操作,

所以就会报illegalStateException异常

 

       解决方法:

       1.重写 

 protected void onSaveInstanceState(Bundle outState) {
  // No call for super(). Bug on API Level > 11.
 }

       这个方法我试过,在我的工程里却不管用,没弄明白为什么,希望大牛解释下

 

       2.将commit方法替换成commitAllowingStateLoss()方法,commitAllowingStateLoss()允许状态丢失,所以正常情况下使用此方法提交事务可能会提交失败

 

       3.在调用popbackstack及commit方法前手动调用onstart()方法将activity的状态恢复,我看过源码之后了解到在activity调用onstart、onpostresume、

         onActivityResult、onNewIntnet时会恢复activity状态


      4.用java反射机制修改FragmentManager的成员变量mStateSaved的值为false,或者执行noteStateNotSaved方法来修改mStateSaved的值。

   FragmentManager fm=getSupportFragmentManager();
		try {
			Field mStateSaved=fm.getClass().getDeclaredField("mStateSaved");
			mStateSaved.setAccessible(true);
			mStateSaved.set(fm, Boolean.valueOf(false));
			System.out.println(mStateSaved.get(fm)+"");
         //上下选其一即可
			Method m=fm.getClass().getMethod("noteStateNotSaved",new Class[]{});
			m.invoke(fm, new Object[]{});
			System.out.println(mStateSaved.get(fm)+"");
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值