【问题标题】:DialogFragment crashes Activity when calling startActivity()DialogFragment 在调用 startActivity() 时使 Activity 崩溃
【发布时间】:2012-10-10 19:24:45
【问题描述】:

我有一个 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 的数字 2 只是 null

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

我试图不关闭对话,但它以同样的方式崩溃。

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


编辑:

Activity 代码(这是一个正常的 Activity,因为该应用针对 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 我的活动有两个简单的方法,我只是将它们包含在帖子中。该活动在 API 的回调中调用一个或另一个并关闭 OnPause()
  • 有趣,还有一个无法理解的片段 IllegalStateExceptions... 我以为我已经看到了所有内容。
  • 您似乎忽略了 DialogFragment 而不是 AlertDialog 本身。如果用户点击是,你能试试这个dialog.dismiss() 而不是dismiss()?字段dialog 可用作onClick() 的第一个参数。
  • 我也试过了,最后唯一有效的就是我下面的答案。

标签: android android-intent android-dialogfragment


【解决方案1】:

显然,Google 将某些内容从 ICS 更改为 JB,并取消了我必须使用的对话:

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

似乎 dialogFragment 并没有像以前那样从片段管理器 OnDismiss 中删除自己,如果有人愿意深入研究源代码并仔细检查社区,那就太好了。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多