DialogFragment显示问题。

  • 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的解决办法解决

你可能感兴趣的:(Android)