2013-02-25 2 views
1

Мне нужно отключить обработку touchhevent для списка, но разрешить детям получать клики. У меня есть макет кадра, который имеет mapview и listview над ним. Когда список пуст, я хочу, чтобы карта обрабатывала все события касания, но когда список заполнен, я хочу, чтобы элементы списка получали клики.Как отключить события TouchView ListView? Разрешить только щелчки дочернего элемента

ответ

2

Вы можете перехватить все события касания в пользовательской FrameLayout (ваша root ViewGroup), используя onInterceptTouchEvent(): http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent).

Что вы делаете, это захват события MotionEvent.ACTION_DOWN и определение того, является ли событие предназначено для ListView или MapView в зависимости от того, пуст ли ListView пуст (доходит до MapView) или заполняется и находится внутри границ ListView (затрагивает ListView). В обоих случаях верните true и запишите следующее событие ACTION_DOWN в onTouchEvent() (по-прежнему FrameLayout). Таким образом, все события касания до ACTION_CANCEL перейдут в onTouchEvent() FrameLayout.

Функция OnTouchEvent() для FrameLayout отправит все события касания либо в ListView, либо в MapView. Решение, представление которого получает события, было принято в onInterceptTouchEvent(), поэтому вам нужно каким-то образом сохранить результат этого решения. Это решение действует между ACTION_DOWN и ACTION_POINTER_UP, ACTION_UP, ACTION_CANCEL событиями.

Я не уверен, хотите ли вы отключить все события касания для непустого ListView, которые не выбирают элемент списка (flinging, scrolling и т. Д.)? Потому что это значительно усложнит ситуацию. Хотя я не думаю, что это имеет смысл с точки зрения пользователя, поскольку элементы списка, не соответствующие видовому экрану ListView, не могут быть нажаты, потому что вы не можете прокручивать вверх или вниз.

Не ожидайте, что это сработает легко. Понимание потока событий движения и взаимодействия между onInterceptTouchEvent() и onTouchEvent() сложнее и делает его работу еще более. Но я уверен, что это возможный способ решить вашу проблему.

Смежные вопросы