错误:视图未附加到窗口管理器

16

我从客户端远程获取以下信息,因此不知道他们使用的硬件等。

java.lang.IllegalArgumentException: View not attached to window manager
       at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
       at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:200)
       at android.view.Window$LocalWindowManager.removeView(Window.java:417)
       at android.app.Dialog.dismissDialog(Dialog.java:279)
       at android.app.Dialog.access$000(Dialog.java:72)
       at android.app.Dialog$1.run(Dialog.java:108)
       at android.app.Dialog.dismiss(Dialog.java:263)
       at com..mysite.android.ActivityGame$1.onFinish(ActivityGame.java:154)
       at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:118)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:123)
       at android.app.ActivityThread.main(ActivityThread.java:4203)
       at java.lang.reflect.Method.invokeNative(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:521)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)

这是由于ProgressDialog引起的。

    progressDialog = new ProgressDialog( this );
    progressDialog.setMessage(getString(R.string.get_ready));
    progressDialog.setCancelable(false);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.setMax(12);
    progressDialog.show();

    new CountDownTimer(3000, 250) {

         @Override
        public void onTick(long millisUntilFinished) {
             //progressDialog.incrementProgressBy(1);
         }

         @Override
        public void onFinish() {
             progressDialog.dismiss(); //********* ERROR HAPPENS HERE *********
             nextQuestion();
         }
    }.start();

在清单文件中,该 Activity 的外观如下所示。

<activity android:theme="@style/GameTheme" android:name=".ActivityGame" android:screenOrientation="portrait" android:launchMode="singleTask" android:configChanges="keyboardHidden|orientation"></activity>

那么这意味着什么呢?我认为这可能与 Activity 被销毁然后重新创建有关,但是正如您所看到的,我已经正确设置了 configChanges。


我见过类似的情况。如果在进度对话框显示时按下主页或返回键,可能会出现此错误。 - Christopher Orr
如果你想使用onConfigurationChange调用而不是重新创建活动,请参考此答案:https://dev59.com/inNA5IYBdhLWcg3wC5Th#2418763。 - Petr Gladkikh
如果有任何帮助,请接受答案。 - Mouhamed Ndiaye
6个回答

21

尝试:

if (pDialog.isShowing()) {
   pDialog.cancel();
}
在您重写的onDestroy()onStop()方法中。

4
有时候,即使在某些情况下做了空值检查和isShowing检查,仍然会出现异常。当我改变屏幕方向时,我仍然会遇到这个异常。 - ılǝ

12

在退出一个Activity后尝试显示对话框时会出现这个问题。

我刚刚通过编写以下代码来解决了这个问题:

public void onDestroy(){
super.onDestroy();
if(progressDialog!=null)
if(progressDialog.isShowing()){
progressDialog.cancel();
}

}

基本上,根据您启动progressDialog的类,覆盖onDestroy()方法,并以此方式执行。这样解决了Activity has leaked window问题。


4
通常发生在您在活动关闭后调用dismiss的情况下。

2

为了处理不可见的视图,您不能使用isShowing()方法,在onDestroy()中应该检查窗口附着本身。

if (pDialog.getWindowToken() != null)
{
   pDialog.dismiss();
}

在我的情况下,我没有使用对话框,而是使用了WindowManager添加的自定义窗口,这个窗口可能是不可见的。

if (test_service_overlay != null) {
     if (test_service_overlay.getWindowToken() != null) {
         WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
         windowManager.removeViewImmediate(test_service_overlay);
     }
}

什么是test_service_overlay? - Shashwat Gupta

1

当我试图在Webview的onPageFinished方法中关闭对话框时,我也遇到了同样的问题。

这里是解决方案:

    if(pDialog.isShowing())
    {
      try
      {
        pDialog.dismiss();
      }
      catch(Exception e) {// nothing }

    }

试一下吧!


0

你也可以询问 "dialog.isIndeterminate()"。这样也可以正常工作。


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