Мне нужно отключить прокрутку, чтобы открыть/закрыть SlidingPaneLayout, потому что мой основной вид - это карта. Я открою/закрою его с помощью кнопки.
Android, отключите swiping для взаимодействия с SlidingPaneLayout
Ответ 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;
}
});