我通过扩展 ViewGroup
创建了一个简单的自定义布局。我在 init()
上创建了一个 Button
和一个 PopupMenu
。如果按下按钮,则会显示 PopupMenu
。问题是,当 PopupMenu
显示时,如果我旋转设备,则会收到以下错误消息。
E/WindowManager: android.view.WindowLeaked: Activity has leaked window android.widget.PopupWindow$PopupDecorView{c44e7da V.E...... ......ID 0,0-392,960} that was originally added here
我发现了类似的问题( PopupMenu PopupWindow$PopupViewContainer leak ),解决方案是调用 PopupMenu
onStop()
的 dismiss()
。但是,由于这不是一个 Activity,而是一个 ViewGroup,所以我没有 onStop()。因此,我试图找到一个类似名称的事件,并找到了onDetachedFromWindow()
。我在 onDetachedFromWindow()
中调用了 dismiss()
。
onDetachedFromWindow()
确实在屏幕旋转之前被调用,但我仍然收到 WindowLeaked 错误消息。
如何解决这个问题?实际上,应用程序似乎工作正常,我得到的只是日志中的错误消息。这个错误可以忽略吗?
最佳答案
也许这个答案对你来说太晚了,但我会分享我发现的内容,以防其他人感兴趣。 PopupMenu
在内部使用PopupWindow
。当您调用 PopupMenu.dismiss()
时,它会调用 PopupWindow.dismiss()
但在指定退出转换时不会立即关闭 PopupWindow
。尽管您在适当的时间调用了dismiss(),但窗口实际上并没有足够快地从层次结构中删除。需要在您的 Activity 被销毁之前将其删除,以免出现此泄漏错误。我没有找到立即关闭 PopupMenu
的方法。一种可能的解决方法是直接使用 PopupWindow
而不是 PopupMenu
,并在关闭之前调用 setExitTransition(null)
。
关于android - 在 PopupMenu 显示时旋转,获取 android.view.WindowLeaked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37323761/