DialogFragment在调用startActivity()时导致Activity崩溃

5

我有一个 DialogFragment,本应该很简单,但在 Jelly Bean 上出现了一些大问题。

这个应用程序使用网络,并弹出一个对话框,要求用户打开 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;
}

如果用户选择是,它会关闭对话框并打开“无线设置”活动。但如果用户选择取消,它只会关闭我的整个活动。在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)

我的布局上有一些片段,额外的日志显示了它们的保存状态,原本应该是 SettingsDialogFragment 的编号是 null

08-05 20:24:22.576: E/FragmentManager(2579):     #2: null

我试图不关闭对话框,但它仍然崩溃了。

我真的不知道这里发生了什么……有什么想法吗?


编辑:

活动代码(它是一个普通的活动,因为该应用程序针对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();
}

你能把所有相关的代码放到PasteBin里吗?错误也可能在你的FragmentActivity中。 - tolgap
@tolgap 我的Activity里有两个简单的方法,我在帖子中已经包含了它们。这个Activity在API的回调中调用其中一个或者另一个,并在OnPause()中关闭。 - Budius
有趣的是,又出现了一个那些难以理解的 IllegalStateException 片段... 我以为我已经见过所有的了。 - User
1
看起来你关闭了 DialogFragment 但没有关闭 AlertDialog 本身。如果用户点击“是”,你可以尝试使用 dialog.dismiss() 而不是仅仅使用 dismiss() 吗?字段 dialog 可以作为 onClick() 的第一个参数使用。 - SheIs_LeThiCongNhan
我也尝试了那种方法,最终有效的只有下面我回答中提到的。 - Budius
1个回答

7

显然,Google在ICS到JB的升级中做了一些改变,为了关闭对话框,我不得不使用:

dismiss();
getFragmentManager().beginTransaction().remove(frag).commit();

看起来dialogFragment在OnDismiss中不再像以前那样从片段管理器中移除自己,如果有人愿意深入源代码并为社区进行双重检查,那将会非常棒。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接