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

时间:2010-07-31 12:29:32

标签: android

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

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();

活动在Manifest中看起来像这样。

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

那么这意味着什么呢?我认为它与被销毁的活动有关,然后创建,但正如你所看到我正确设置了configChanges。

6 个答案:

答案 0 :(得分:21)

尝试:

if (pDialog.isShowing()) {
   pDialog.cancel();
}
在被覆盖的onDestroy()onStop()方法中

答案 1 :(得分:13)

在您退出Activity后尝试显示对话框时会出现此问题。

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

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

}

基本上,您从哪个班级progressDialog开始,覆盖onDestroy()方法并按此方式执行。它解决了 Activity泄露窗口问题。

答案 2 :(得分:3)

通常在活动结束后致电解雇时发生。

答案 3 :(得分:2)

为了处理不可见的视图,你不能使用isShowing()并且应该在你的onDestroy()

中检查窗口附件本身
if (test_service_overlay != null) {
     if (test_service_overlay.getWindowToken() != null) {
         WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
         windowManager.removeViewImmediate(test_service_overlay);
     }
}

或者就我而言,我没有使用对话框,而是使用WindowManager添加的自定义窗口,该窗口可能是不可见的。

SUM()

答案 4 :(得分:1)

当我尝试在Web视图的onPageFinished方法中关闭对话框时,我也遇到了同样的问题。 有时在活动结束后调用onPageFinished。

以下是解决方案:

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

    }

试试吧!

答案 5 :(得分:0)

您也可以询问“dialog.isIndeterminate()”。工作正常。