Android: как закрыть пользовательский вид, когда пользователь нажимает за пределами вида - PullRequest
2 голосов
/ 21 апреля 2011

У меня есть пользовательский View, который состоит из кнопки и вида, который анимируется ниже кнопки, который содержит пользовательский вид элементов с множественным выбором.Когда пользователь нажимает кнопку, я показываю «выпадающий список» с элементами.Я хочу скрыть «выпадающий», когда они нажимают за пределами выпадающего.Я пытался переопределить onTouchEvent и onInterceptTouchEvent, но они не всегда называются.

Я посмотрел на источник для Spinner и заметил, что Google использует диалог для того, что я считаю его раскрывающимся списком (как он позиционируется, на данный момент мне неизвестно).

Могу ли я, чтобы мой View перехватывал ВСЕ события касания на Window?

Ответы [ 2 ]

4 голосов
/ 21 апреля 2011

Вы можете реализовать onTouchListener в верхней части ViewGroup (например, на LinearLayout или как вы используете).

Затем определите положение своего пользовательского вида: если позиция касания (с использованием методов event.getX() и event.getY()) находится за пределами вида (с использованием myView.getTop() и т. Д.), То он может скрыть его (myView.setVisibility(View.GONE).

В любом случае, return false должно позволять детям View s обрабатывать прикосновения.

Из руководства разработчика Android:

Помните, что ключевые события всегда доставляются в вид, который в данный момент находится в фокусе. Они отправляются, начиная с вершины иерархии View, а затем вниз, пока не достигнут нужного места назначения.

Примечание. Android сначала вызывает обработчики событий, а затем соответствующие обработчики по умолчанию из определения класса. Таким образом, возврат true из этих прослушивателей событий остановит распространение события на другие прослушиватели событий, а также заблокирует обратный вызов для обработчика событий по умолчанию в представлении. Поэтому убедитесь, что вы хотите прекратить событие, когда вернете true.

0 голосов
/ 21 апреля 2011

Я понятия не имею, как это работает, но TouchDelegate может быть решением на первый взгляд. Кроме того, Activity.onTouchEvent() может стоить чека.

Если они неприменимы (т. Е. Вы не знаете, как использовать TouchDelegate, и у вашего макета есть кнопки, которые могли бы выполнять прикосновения за пределами «выпадающего» представления), вы можете перехватить событие , пока оно все еще идет "вверх" в сторону просмотров.

...