调用startActivity()时DialogFragment崩溃活动

Bud*_*ius 5 android android-intent android-dialogfragment

我有一个DialogFragment应该是简单的,但它给了我一些特别关于果冻豆的大问题.

该应用程序使用网络,它弹出一个对话框,要求用户打开WiFi或取消然后关闭它.因此它扩展DialogFragment并创建视图:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog a = new AlertDialog.Builder(getActivity()).setCancelable(true).setTitle(R.string.dialog_title_disabled)
            .setMessage(R.string.dialog_text)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dismiss();
                        Intent i = new Intent(Settings.ACTION_WIRELESS_SETTINGS);
                        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(i);
                    }
            }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        getActivity().finish();
                    }
            }).create();
    //a.setCanceledOnTouchOutside(false);
    return a;
}
Run Code Online (Sandbox Code Playgroud)

如果用户单击"是",则会取消对话框并打开"无线设置"活动.或者,如果用户单击"取消",它只会关闭我的整个活动,但是在Jelly Bean上,只要我单击"是",它就会打开"设置",但应用程序强制将关闭并显示以下错误:

08-05 20:24:22.584: E/AndroidRuntime(2579): java.lang.IllegalStateException: Failure saving state: active SettingsDialogFragment{425dd550} has cleared index: -1
08-05 20:24:22.584: E/AndroidRuntime(2579):     at android.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1653)
Run Code Online (Sandbox Code Playgroud)

还有一些额外的日志记录显示了我布局中每个片段的已保存状态,而应该是的数字2 SettingsDialogFragment只是null:

08-05 20:24:22.576: E/FragmentManager(2579):     #2: null
Run Code Online (Sandbox Code Playgroud)

我试图不解除对话,但它以同样的方式崩溃.

我真的不确定这里发生了什么......有什么想法吗?


编辑:

活动代码(这是一个正常的活动,因为该应用程序的目标是ICS及以上):

private void showDialog() {
    SettingsDialogFragment diag = (SettingsDialogFragment) getFragmentManager().findFragmentByTag(DIALOG_TAG);
    if (diag == null) {
        diag = new SettingsDialogFragment();
        diag.show(getFragmentManager(), DIALOG_TAG);
    } else {
        if (!diag.isVisible())
            diag.show(getFragmentManager(), DIALOG_TAG);
    }
}

private void dismissDialog() {
    SettingsDialogFragment diag = (SettingsDialogFragment) getFragmentManager().findFragmentByTag(DIALOG_TAG);
    if (diag != null)
        diag.dismiss();
}
Run Code Online (Sandbox Code Playgroud)

Bud*_*ius 7

显然谷歌改变了从ICS到JB的东西,并驳回了我必须使用的对话:

dismiss();
getFragmentManager().beginTransaction().remove(frag).commit();
Run Code Online (Sandbox Code Playgroud)

似乎dialogFragment并没有像以前那样从片段管理器OnDismiss中删除它自己,如果有人想要深入挖掘源代码并仔细检查社区,它就会超级.

谢谢.