Android, отключите swiping для взаимодействия с SlidingPaneLayout - программирование
Подтвердить что ты не робот

Android, отключите swiping для взаимодействия с SlidingPaneLayout

Мне нужно отключить прокрутку, чтобы открыть/закрыть SlidingPaneLayout, потому что мой основной вид - это карта. Я открою/закрою его с помощью кнопки.

4b9b3361

Ответ 1

Подкласс SlidingPaneLayout, переопределить onInterceptTouchEvent() и заставить его всегда возвращать false. Это предотвратит обработку событий SlidingPaneLayout.

Подробнее см. http://developer.android.com/training/gestures/viewgroup.html.

Обновление:
Если сенсорные события не обрабатываются детским представлением (-ами), метод SlidingPaneLayout onTouchEvent() будет называться все же. Чтобы полностью отключить обработку событий касания, также переопределите onTouchEvent() и всегда возвращайте false.

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    return false;
}

Примечание.. Недостатком этого подхода является то, что события касания все равно отправляются на второй дочерний вид, когда он только частично виден. Поэтому вы можете проверить другие ответы.

Ответ 2

Это немного сложно. Если вы всегда возвращаете true в onInterceptTouchEvent(), он отправит событие на скрытый контент ниже. Я смог добиться этого так:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return !slidingEnabled || super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (!slidingEnabled) {
        // Careful here, view might be null
        getChildAt(1).dispatchTouchEvent(ev);
        return true;
    }
    return super.onTouchEvent(ev);
}

Ответ 3

Если вы хотите отключить событие "перетащить для открытия" и включить ввод пользователя после открытия макета, вы можете использовать этот

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {

    if(!isOpen()) return false;

    return super.onInterceptTouchEvent(arg0);
}  

Ответ 4

Основываясь на романе Жилича, ответьте двумя улучшениями.

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return !swipeEnabled || super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (!swipeEnabled) {
        if (!getChildAt(0).dispatchTouchEvent(ev)) {
            ev.offsetLocation(-getChildAt(0).getWidth(),0);
            getChildAt(1).dispatchTouchEvent(ev);
        }
        return true;
    }
    return super.onTouchEvent(ev);
}

Во-первых, это пытается отправить MotionEvent первому ребенку, прежде чем отправлять его ко второму. Таким образом, оба дочерних представления остаются интерактивными. Во-вторых, MotionsEvents, отправленные во второе дочернее представление, должны быть смещены по ширине первого представления. Это предполагает, что скользящая панель скользит слева, как обычно, с помощью SlidingPaneLayout.

Ответ 5

Если вы установили touchlistener и вернули true, он будет использовать событие касания, и виджет не будет обрабатывать его дальше.

slidingPaneLayout.setOnTouchListener(new View.OnTouchListener() { 
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return true;
    }
});