我正在做一些背景工作,并在执行此操作时显示DialogFragment。一旦完成工作并调用了相关的回调,我便关闭了该对话框。当我这样做时,我在android源代码中遇到了由NPE引起的崩溃:

void dismissInternal(boolean allowStateLoss) {
        if (mDialog != null) {
            mDialog.dismiss();
            mDialog = null;
        }
        mRemoved = true;
        if (mBackStackId >= 0) {
            getFragmentManager().popBackStack(mBackStackId,
                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
            mBackStackId = -1;
        } else {
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.remove(this);
            if (allowStateLoss) {
                ft.commitAllowingStateLoss();
            } else {
                ft.commit();
            }
        }
    }

特别是在此行:FragmentTransaction ft = getFragmentManager().beginTransaction();

最佳答案

如Sogger所说,在调用show()之前调用dismiss()时,也可能会发生这种情况。

在构造Dialog对象之后但不显示对话框之前,如果可以传递(mDialog!= null),则将发生NullPointerException。

当您检查mDialog是否为null时,

if (mDialog != null) {
    mDialog.dismiss();
    mDialog = null;
}

添加更多类似下面的条件,
if ((mDialog != null) && mDialog.isAdded() && mDialog.isResumed()) {
    mDialog.dismiss();
    mDialog = null;
}

我认为mDialog.iwego()条件可能就足够了...

10-06 06:55