应用程序在对话框关闭时崩溃

时间:2016-11-24 06:24:56

标签: android

我知道这个问题有很多解决方案,但没有一个能为我工作。即使在完成所有检查之后,我的应用程序也会在关闭对话框时崩溃。

以下是我正在使用的代码:

<img id="Offer_Description" style="position:absolute; width: 950px; height:565px; top:640px; left:70px; z-index=99; margin:auto;">

我正在使用此方法解除所有对话框,但用户仍然遇到这些崩溃。

参见日志:

public void dismissDialog(int dialogId) {
    Dialog dialog = getDialog(dialogId);
    Activity activity = mActivity.get();
    if (activity != null && !activity.isFinishing()) {
        if (dialog != null) {
            if (dialog.isShowing()) {
                dialog.dismiss();
            }
            mDialogsMap.remove(dialogId);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这是因为视图被破坏后对话框关闭了......试试这个

if (view.isShown()) {
dialog.dismiss()
}

答案 1 :(得分:0)

您的问题是您正在尝试关闭未附加的对话框。

java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{144f7eb V.E...... R......D 0,0-684,240} not attached to window manager

您应该传递对话框对象,而不是传递dialogId。您是否存储了一个打开的hashmap或对话框列表,并试图迭代地关闭它们?你到底想要达到什么目的?如果您正在传递对话框,您至少可以保证它们已被附加,或者至少检查它们是否仍然附着。

以下是我如何管理片段内点击的示例  https://github.com/jmitchell38488/android-todo-app/blob/master/app/src/main/java/com/github/jmitchell38488/todo/app/ui/activity/ListActivity.java

List<DialogFragment> dialogs = new ArrayList<>();
dialogs.add(myNewDialog);
@Override
public void onDialogPositiveClick(DialogFragment dialog) {
    if (some_code_that_does_not_dismiss) {
        dialog.remove(dialog);
        ...
    } else {
        dialog.dismiss();
    }
}

根据反馈进行修改: 如果您正在存储弱引用(我认为这是错误的 - 您可以随时打开多少对话框或存储在内存中?),那么您需要使用DialogManager来管理它们,以及一个DialogFactory来实例化它们,最重要的是,你需要一个扩展DialogFragment的抽象类,这样你就可以集中你的解雇和管理逻辑。这样你需要做的就是:

DialogFactory.getInstance(/** args **/)

然后在onStop或onDestroy里面:

// If you want to store them in the bundle
SerializedDialogManager = DialogManager.serialize();

// Else, delete them
DialogManager.shutdown();

在关机内部,您检查每个对话框以查看它是否仍然存在且可以被解雇:

List<Integer> dialogIds = new ArrayList<>();
for (int id ; dialogIds) {
    Dialog d = getDialog(id);
    if (d != null && d.isShown()) {
        d.dismiss();
    }
}

但实际上,您应该在对话框中处理您的解雇操作。

值得深思,但我个人认为你不应该过多地使用弱引用,让活动/对话框处理实例化并关闭。