- dialogfragment加载的布局不显示,只是显示了设置的背景半透明。报错如下:
com.demo E/IMGSRV: :0: gralloc_module_createfence: Failed to merge mapper sync fds
com.demo E/IMGSRV: :0: QueueCancelBufferWrapper: Failed to create buffer sync object
com.demo W/HardwareRenderer: EGL error: EGL_BAD_SURFACE
com.demo W/HardwareRenderer: Mountain View, we've had a problem here. Switching back to software rendering.
最后将dialogfragment改为了fragment,此问题就消失了。
- dialogFragment.show的时候,崩溃,异常如下。
java.lang.IllegalStateException
Can not perform this action after onSaveInstanceState
出这个原因是在show的时候所依附的activity已经被销毁了,onSaveInstanceState在按下Home键的时候或者在异常销毁的时候会被调用。
看看为什么会这样commit的时候:
//在activity执行onSaveInstanceState后,会调用自身的fragmentManager的saveAllState方法:
Parcelable saveAllState() {
//省略部分代码
mStateSaved = true;//设置已保存状态
}
//再看看fragment添加的代码
public int commit() {
return commitInternal(false);
}
public int commitAllowingStateLoss() {
return commitInternal(true);
}
int commitInternal(boolean allowStateLoss) {
//省略部分代码
mManager.enqueueAction(this, allowStateLoss);
return mIndex;
}
public void enqueueAction(Runnable action, boolean allowStateLoss) {
if (!allowStateLoss) {
checkStateLoss();//commit的话,就会执行状态检查
}
}
private void checkStateLoss() {
if (mStateSaved) {//检查到已经被保存了,则会抛出异常。
throw new IllegalStateException(
"Can not perform this action after onSaveInstanceState");
}
}
本来针对fragment的解决办法应该是:添加fragment的时候用commitAllowingStateLoss
但是在dialogFragment使用show的方法里面是用的commit。
解决办法:
1:在dialogFragment里面在show的地方捕获一下异常就可以了
try {
dialogFragment.show(fragmentManager, "DialogFragment");
} catch (Exception e) {//在activity销毁的时候,可能出现异常
e.printStackTrace();
}
//在dismiss的时候同理。
try {
dialogFragment.dismiss();
} catch (Exception e) {//在activity销毁的时候,可能出现异常
e.printStackTrace();
}
2:把dialogFragment当fragment使用,不适用onCreatDialog,使用onCreatView,这样也可以自己按照fragment的解决办法解决