2

を拡張して、簡単なカスタム レイアウトを作成しましたViewGroup。と を作成ButtonPopupMenuますinit()。ボタンが押されると、PopupMenuが表示されます。問題は、PopupMenuが表示されているときにデバイスを回転させると、次のエラー メッセージが表示されることです。

E/WindowManager: android.view.WindowLeaked: アクティビティがウィンドウ android.widget.PopupWindow$PopupDecorView{c44e7da VE..... ......ID 0,0-392,960} をリークしました。最初にここに追加されました

同様の質問 ( PopupMenu PopupWindow$PopupViewContainer leak ) を見つけましたが、解決策dismiss()PopupMenu onStop(). ただし、これはアクティビティではなく であるため、 はViewGroupありませんonStop()。そこで、似たような名前のイベントを探してみたところ、 が見つかりましonDetachedFromWindow()た。私は電話をかけdismiss()ましたonDetachedFromWindow()

onDetachedFromWindow()画面の回転の前に呼び出されますが、それでも WindowLeaked エラー メッセージが表示されます。

どうすればこの問題を解決できますか? 実際、アプリケーションは正常に動作しているようで、ログにエラー メッセージが表示されるだけです。このエラーは無視できますか?

4

1 に答える 1

2

おそらく、この答えはあなたには遅すぎますが、他の誰かが興味を持っている場合に備えて、私が見つけたことを共有します. 内部でPopupMenu使用します。PopupWindow呼び出すPopupMenu.dismiss()と呼び出しますが、終了遷移が指定されている場合、PopupWindow.dismiss()aを閉じるとすぐには実行されません。PopupWindow適切なタイミングで呼び出すという事実にもかかわらず、dismiss()ウィンドウは実際には十分な速さで階層から削除されません。この漏れエラーが発生しないようにするには、アクティビティが破棄される前に削除する必要があります。PopupMenuすぐに却下する手段がわかりません。考えられる回避策は、 のPopupWindow代わりに , を直接使用し、閉じる前にPopupMenu呼び出すことです。setExitTransition(null)

于 2016-10-20T08:43:53.953 に答える