2016-05-19 1 views
1

Я создал простой пользовательский макет, расширив ViewGroup. Я создаю Button и PopupMenu на init(). Если кнопка нажата, отобразится PopupMenu. Проблема в том, что когда отображается PopupMenu, если я вращаю устройство, я получаю следующее сообщение об ошибке.Вращение в то время как PopupMenu показывает, получает android.view.WindowLeaked

E/WindowManager: android.view.WindowLeaked: Активность просочилась окно android.widget.PopupWindow $ PopupDecorView {c44e7da VE ..... ...... ID 0,0-392,960 }, который первоначально был добавлен здесь

Я нашел подобный вопрос (PopupMenu PopupWindow$PopupViewContainer leak), и раствор вызова dismiss() из PopupMenuonStop(). Однако, поскольку это не активность, а ViewGroup, у меня нет onStop(). Итак, я попытался найти аналогично названное событие и нашел onDetachedFromWindow(). Я позвонил dismiss() в onDetachedFromWindow().

onDetachedFromWindow() действительно вызывается перед вращением экрана, но я все еще получаю сообщение об ошибке WindowLeaked.

Как я могу решить эту проблему? На самом деле, похоже, приложение работает нормально, и все, что я получаю, - это сообщение об ошибке в журнале. Незначительная ошибка?

+0

Вы нашли решение? – Renjith

ответ

0

Возможно, этот ответ слишком поздно для вас, но я поделюсь тем, что узнал, если кто-то еще заинтересован. PopupMenu использует PopupWindow внутренне. Когда вы вызываете PopupMenu.dismiss(), он вызывает PopupWindow.dismiss(), но отклонение PopupWindow не является непосредственным, когда указан переход на выход. Несмотря на то, что вы вызываете dismiss() в соответствующее время, окно фактически не удаляется из иерархии достаточно быстро. Он должен быть удален до того, как ваша деятельность будет уничтожена, чтобы не получить эту ошибку утечки. Я не вижу средств для немедленного отклонения PopupMenu. Возможным обходным решением может быть использование PopupWindow непосредственно вместо PopupMenu и вызов setExitTransition(null) перед увольнением.

+0

Реализация всплывающего меню с нуля из PopupWindow, кажется, очень много работы. Несмотря на то, что я вижу сообщение об исключении, никакого заметного влияния на него не было. Поэтому мой вопрос в том, могу ли я игнорировать это. Поскольку имя содержит «утечку», означает ли это, если это исключение происходит, память не восстанавливается? –

+0

Ну, я решил проигнорировать это. Похоже, что это не произойдет на старых версиях Android до API 23. Я надеюсь, что Google скоро исправит это. – itotsev