Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Попробуйте добавить 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);
}

Ответ 4

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

Ответ 5

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

android:clickable="true"