Intereting Posts
Общие настройки перезагружаются, когда приложение принудительно закрывается или падает Потребление резьбы и аккумулятора Как получить pid приложения Android с помощью оболочки adb? Как импортировать файлы в sdcard на эмуляторе в Android? Устройства Android / webOS поддерживают мультисайтовые события Javascript? Экран принудительного включения Android ActionBar – нажмите пользовательский вид в нижней части экрана. Android: Как определить, находится ли событие касания в круге? Как установить приложение Google Play в эмулятор Android Studio? Настройка многострочного TextView на Android Android: DigitalClock удаляет секунды Защитите от поддельных обзоров в Google Play Реализация интерфейса View.IOnTouchListener Развернуть / свернуть Анимация: малая лага || MeasureSpec возвращает неверное значение Ошибка камеры «Не удается подключиться к камере» или на некоторых телефонах появляется ошибка «Камера используется другим приложением»,

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

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

Solutions Collecting From Web of "Android, отключите прокрутку для взаимодействия с SlidingPaneLayout"

Подкласс 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; } 

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

Это немного сложно. Если вы всегда возвращаете 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); } 

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

 @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { if(!isOpen()) return false; return super.onInterceptTouchEvent(arg0); } 

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

 @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.

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

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