Да, я не уверен, что уменьшение сложности вашего макета поможет вам. Какая версия API работает на вашем устройстве / эмуляторе? Потому что я заметил изменение с 2.1 до 2.2 вокруг запуска события прокрутки в интерактивном представлении, как вы описали.
В моем случае я включаю вложенную прокрутку с помощью метода requestDisallowInterceptTouchEvent()
. Обычно это позволило бы мне поместить ScrollView или ListView внутри другого ScrollView и по-прежнему правильно прокручивать его. Однако, начиная с уровня API 8, эта «вложенная прокрутка» больше не работает, если сенсорное событие запускается на «кликабельном» элементе управления! Augh! Я не смотрел на источник, чтобы точно определить, почему это происходит, но похоже, что это связано с вашей проблемой.
Похоже, что недавно произошло изменение в том, как интерактивные элементы управления потребляют сенсорные события, что в некоторых случаях отрицательно сказывается на их родителях. Я сомневаюсь, что есть решение.
Edit:
Если вы хотите реализовать «щелчки» другим способом, это, безусловно, возможно. Обычно я бы не рекомендовал это, но тогда я не знаю, насколько плоха ваша прокрутка. До вас.
Если вы хотите это сделать, вы можете добавить OnTouchListener к вашему ScrollView, но я думаю, что это будет более трудный способ сделать это. Вам нужно будет прослушивать события ACTION_UP
, но использовать события только в том случае, если соответствующее событие ACTION_DOWN
было меньше, чем touchSlop
далеко в направлении y (touchSlop
- это минимальное расстояние, которое должно пройти касание ListView
начнет прокрутку ... он получает это значение из ViewConfiguration
). Затем, когда вы используете событие, вам нужно будет добавить ListView.getScrollX()
и ListView.getScrollY()
к координатам события, чтобы сравнить его с позициями ваших интерактивных элементов управления. И если вы хотите «длинные клики», вам придется проделать больше работы для их реализации. И все это только для сенсорных событий ... вам также нужно добавить ключевой слушатель, чтобы ваши пользователи могли использовать трекбол для его нажатия.
Я думаю, что вместо этого вы можете добавить OnTouchListener для каждого из ваших элементов управления вместо OnClickListener. Проверьте просмотр исходного кода, чтобы увидеть, как регистрируются клики. Если вам не нужно регистрировать «длинные клики», вам будет намного легче. Тогда вы сможете обработать практически любое событие ACTION_UP
одним кликом. Вам также понадобится ключевой слушатель, чтобы обрабатывать щелчки трекбола.
Похоже, много работы для небольшого сбоя прокрутки. Интересно, правильно ли я понял вопрос, действительно ли это более серьезная проблема, чем я думаю?