Ошибка: просмотр не подключен к менеджеру окон

Я получаю следующее удаленное от клиентов, поэтому я не знаю, какое оборудование и т.д. они используют.

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

И что это могло означать? Я думаю, что это как-то связано с тем, что действие было уничтожено, а затем создано, но, как вы видите, я правильно установил configChanges.

Ответы

Ответ 1

Try:

if (pDialog.isShowing()) {
   pDialog.cancel();
}

в ваших переопределенных методах onDestroy() или onStop().

Ответ 2

Эта проблема возникает при попытке показать диалог после выхода из Activity.

Я просто решил эту проблему, просто записав следующий код:

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

}

В принципе, из какого класса вы запустили progressDialog, переопределите метод onDestroy() и сделайте это. Он решил, что у Activity возникла проблема с окном.

Ответ 3

Обычно это происходит, когда вы вызываете увольнение после закрытия активности.

Ответ 4

Чтобы обрабатывать невидимые виды, вы не можете использовать 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);
     }
}

Ответ 5

Мне также пришлось столкнуться с той же проблемой, когда я попытался отклонить диалог по методу веб-представления onPageFinished. иногда onPageFinished, вызванный после закрытия активности.

Вот решение для него:

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

    }

Попробуйте!

Ответ 6

Вы также можете задать "dialog.isIndeterminate()". Прекрасно работает.