Обработка события Touch Intercept без расширения ViewGroup

У меня есть один RelativeLayout и в этом макете имеется около 10 просмотров.

Я установил OnTouchListener в этот макет и проделал некоторую работу в нем и вернул true .

Этот прослушиватель отлично работает, когда я касаюсь макета, где нет «Вид» (означает «Пустое место»). Если я касаюсь детского вида этого макета, этот слушатель не стреляет …

И из документации я понял, что мы можем переопределить onInterceptTouchEvent() , расширив ViewGroup (так вот RelativeLayout) и обработав события касания до того, как дочерние представления потребляют это событие …

Это сделает трюк, но мне нужно изменить многие XML-файлы, где мне нужна эта функциональность, заменив RelativeLayout на свой CustomRelativeLayout.

Поэтому мой вопрос:

Есть ли способ обработать событие касания для RelativeLayout (forcourse ViewGroup) до того, как дочерние представления в RelativeLayout потребляют событие? Я не хочу распространять RelativeLayout

Попробуйте переопределить

 @Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); } 

Activity . Этот метод является первым, что касается событий процесса. Но в этом случае вам нужно работать с текущими координатами представлений

Хотя это и не обязательно идеально, это хорошо работает для небольших макетов, которые не будут иметь динамический контент.

В xml установите android:clickable="false" всем потомкам ViewGroup в макете (включая вложенные группы представлений и их дочерние элементы). Каждый ребенок, на который нажимается, затем распространяет клик на родителя, в конечном итоге попадая на обработчики сенсорных обработок по умолчанию в ViewGroup. Обязательно настройте root ViewGroup, где вы хотите получить события click в качестве android:clickable="true" или viewgroup.setClickable(true)

Если вы динамически добавляете представления, обязательно вызывайте view.setClickable(false); Перед добавлением его в иерархию представлений.

Попробуйте вернуть false в onTouchEvent() дочерних представлений при обработке события ACTION_DOWN . Поэтому события касания переадресации не будут отправляться на детские представления, иначе это событие не будет потреблено.

Попробуйте добавить onTouchListener в RelativeLayout

 RelativeLayout rl = (RelativeLayout) findViewById( R.id.relativeLauout ); rl.setOnTouchListener( new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // do something return false; } }); 

Или использовать метод onTouchEvent из Activity

 @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return super.onTouchEvent(event); } 

Вы можете просто установить в xml:

 android:clickable="true"