1. ホーム
  2. android

[解決済み] android Viewがウィンドウマネージャに接続されていない

2022-10-17 04:31:10

質問

以下のような例外が発生しています。

java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
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:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)

ググってみたところ、ポップアップや画面を回転させることと関係があるようですが、私のコードへの言及はないようです。

質問内容ですが

  1. この問題が この問題が発生するのはいつなのか、正確に 知る方法はありますか?
  2. 画面を回転させる以外に、このエラーを誘発する別のイベントまたはアクションがありますか。
  3. どのようにしたら、この現象を防ぐことができますか?

どのように解決するのですか?

画面の向きが変わると、プログレスダイアログのあるAsyncTaskが完了する前にアクティビティが終了してしまうという問題がありました。私は、ダイアログを null に設定することによってこれを解決するように見えました。 onPause() を設定し、次に終了する前にAsyncTaskでこれをチェックします。

@Override
public void onPause() {
    super.onPause();

    if ((mDialog != null) && mDialog.isShowing())
        mDialog.dismiss();
    mDialog = null;
}

... 私のAsyncTaskの中で。

protected void onPreExecute() {
    mDialog = ProgressDialog.show(mContext, "", "Saving changes...",
            true);
}

protected void onPostExecute(Object result) {
   if ((mDialog != null) && mDialog.isShowing()) { 
        mDialog.dismiss();
   }
}