ViewPager перехватывает все события onTouch по оси x. Как отключить?
Масштаб
Существует курант с двумя фрагментами. Один из этих фрагментов имеет макет, который прислушивается к изменениям onTouch по оси X.
Проблема
Макет не получает почти все события Action.Move при касании и скольжении по оси X.
Кажется, что viewpager имеет onInterceptTouchEvent, который возвращает true.
Вопрос
Можно ли переопределить поведение viewpager, чтобы сделать его и мой макет работать вместе? Таким образом, идеальная ситуация - это перехват всех событий onTouch на нем, а viewpager управляет остальными событиями onTouch. Спасибо!
Ответы
Ответ 1
Вы правы, я считаю, что каждый прокручиваемый контейнер перехватывает события касания, но вы можете его предотвратить. Вы можете поместить прослушиватель касания в свой макет:
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
pager.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
pager.requestDisallowInterceptTouchEvent(false);
break;
}
}
Ответ 2
Аналогичная ситуация (но не использование ViewPager), поместив это в представление, которое потребовало срабатывания сенсорного события для меня. Добавьте проверки для MotionEvents, кроме ACTION_MOVE
, если применимо к вашему прецеденту.
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
this.getParent().requestDisallowInterceptTouchEvent(true);
return true;
} else {
return super.onTouchEvent(event);
}
}
Ответ 3
нейтрино было правильным!
getParent().requestDisallowInterceptTouchEvent(true);
как только просмотрщик получит доступ к перехвату touchEvent, дочерний вид в нем может получить событие.
введите здесь описание изображения
Я использую FrameLayout в viewpager, чтобы получить эффект DrawerLayout (мне нужно, чтобы он не соответствовал высоте экрана, поэтому я не могу использовать drawerlayout или навигационный ящик).
Это действительно помогает!
Ответ 4
У меня была аналогичная проблема.
В моем случае я устанавливал OnTouchListener
на ViewPager
, но он не получал события касания, когда дети, получившие прикосновение, установили onClick
.
Что я сделал, так это расширение класса ViewPager и вызов моего прослушивателя кликов внутри метода onInterceptTouchEvent(boolean)
, и он работал нормально. Просто будьте осторожны, чтобы не перехватывать неправильные события.