我知道这个问题有很多解决方案,但没有一个能为我工作。即使在完成所有检查之后,我的应用程序也会在关闭对话框时崩溃。
以下是我正在使用的代码:
<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);
}
}
}
答案 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();
}
}
但实际上,您应该在对话框中处理您的解雇操作。
值得深思,但我个人认为你不应该过多地使用弱引用,让活动/对话框处理实例化并关闭。