当调用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();
}