我在WindowLeaked遇到了一个大问题:
E/WindowManager: android.view.WindowLeaked: Activity CrearGrupo has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{3702bf39 V.E..... R....... 0,0-960,883} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:271)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.app.Dialog.show(Dialog.java:298)
at es.uva.tel.gco.CrearGrupo$2.onClick(CrearGrupo.java:175)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
这里是代码:
final Dialog dialog2 = new Dialog(activity, R.style.dialog);
tituloDialogo=res.getString(R.string.crearGrupoDiálogo);
dialog2.setTitle(tituloDialogo +" "+listaAsignaturas.get(pos));
dialog2.setContentView(R.layout.prefijo_grupo);
if (control == 0){
//listNotebooks(pos);
Intent intent=new Intent(getApplicationContext(),MostrarCrearGrupos.class);
intent.putExtra("asignatura",listaAsignaturas.get(pos));
intent.putExtra("prefijo",prefGrupo.getText().toString());
intent.putExtra("nombreLibreta",notebookName);
startActivity(intent);
}
}
});
dialog2.show();
Dialog是一个普通的窗口,有2个输入,可以输入一个名字和1个前缀但是当我尝试显示另一个对话框时,应用程序崩溃了。 我已经找到了解决方案,并尝试用以下方法解决:
@Override
public void onDestroy() {
super.onDestroy();
if (dialog2 != null) {
dialog2.dismiss();
dialog2 = null;
}
}
@Override
protected void onPause(){
super.onPause();
if (dialog2 != null) {
dialog2.dismiss();
dialog2 = null;
}
}
@Override
protected void onStop(){
super.onStop();
if (dialog2 != null) {
dialog2.dismiss();
dialog2 = null;
}
}
但它不起作用。有任何想法吗。
谢谢你的回答。 :)
答案 0 :(得分:0)
在这种情况下,您将尝试在启动新活动后调用dialog2.show()。删除它,您的代码将起作用。
以下是出现泄漏窗口错误的主要原因:
我们知道每个Activity Android都有一个WindowManager窗口管理器,同样,它建立在一个Activity对话框之上,PopupWindow也有相应的WindowManager窗口管理器。因为对话框,来自Activity的PopupWindown并不应该单独存在,所以当我们进入带有Dialog(或PopupWindow)Activity的finish()时会显示一个Dialog或PopupWindow,会抛出Window Leaked异常。对话框(或PopupWindow)WindowManager有谁不能加入。所以它已经泄露了窗口管理器。
Android.view.WindowLeaked通常出现在Activity和Dialog的显示中。
在对话框中创建活动,如果先关闭Dialog然后关闭Activity是正常的,如果先关闭Activity然后关闭Dialog将错误android.view.WindowLeaked错误。 分析原因是:Dialog是基于Activity创建的:new ProgressDialog(this);这是活动。 Activtity首先完成,然后Dialog将没有附件,因此将报告android.view.WindowLeaked。