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), и он работал нормально. Просто будьте осторожны, чтобы не перехватывать неправильные события.