OnDragListener не получает DRAG_STARTED или DRAG_ENDED, но получает ACTION_DROP

У меня OnDragListener проблема с OnDragListener . Мой целевой вид получает событие ACTION_DROP и обрабатывает его; Но он никогда не получает ACTION_DRAG_STARTED или ACTION_DRAG_ENDED события (на самом деле он никогда не получает никаких событий, кроме капли).

Что может быть причиной этого? Это проблема, потому что я не могу справиться с ситуацией, когда падение происходит вне цели.

Я нашел этот вопрос, но ответ мне не был ясен. Любые идеи получили высокую оценку.

В моем перетаскиваемом виде этот OnTouchListener :

 @Override public boolean onTouch(View v, MotionEvent ev) { switch (ev.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: startPointX = ev.getX(); startPointY = ev.getY(); isOnClick = true; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (isOnClick) { isOnClick = false; // handle single click } break; case MotionEvent.ACTION_MOVE: if (isOnClick && movePassesThreshold(ev)) { isOnClick = false; draggableView.startDrag(...); } break; default: break; } return true; } 

И у целевого представления есть этот OnDragListener :

 @Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: Log.v(TAG, "drag started"); break; case DragEvent.ACTION_DRAG_ENTERED: break; case DragEvent.ACTION_DRAG_EXITED: break; case DragEvent.ACTION_DROP: Log.v(TAG, "drop"); // handle drop break; case DragEvent.ACTION_DRAG_ENDED: Log.v(TAG, "drag ended"); break; default: return false; } return true; } 

Это известная проблема с ViewGroup:

https://code.google.com/p/android/issues/detail?id=25073

Переопределение функции dispatchDragEvent, предложенное в этой ссылке, работало на меня:

 @Override public boolean dispatchDragEvent(DragEvent ev){ boolean r = super.dispatchDragEvent(ev); if (r && (ev.getAction() == DragEvent.ACTION_DRAG_STARTED || ev.getAction() == DragEvent.ACTION_DRAG_ENDED)){ // If we got a start or end and the return value is true, our // onDragEvent wasn't called by ViewGroup.dispatchDragEvent // So we do it here. onDragEvent(ev); } return r; } 

Мое решение – это обходное решение: когда мой OnTouchListener получает ACTION_UP, установите 1-секундную задержанную runnable, чтобы проверить, продолжает ли просмотр. Если OnDragListener получил падение, runnable ничего не делает; Но если бы не выполняемые вызовы перестали перетаскивать, чтобы очистить и сбросить представление до его предыдущей позиции.

 case MotionEvent.ACTION_UP: if (isOnClick) { isOnClick = false; // handle single click } else if (draggableView.isDragging()) { uiHandler.postDelayed(new Runnable() { @Override public void run() { if (draggableView.isDragging()) { // Drop never got received, so call stopDrag draggableView.stopDrag(); } } }, 1000); } break; 

Вот как я это делаю. Я не знаю, будет ли это работать для вас или нет, но все равно опубликовано.

 @Override public boolean onTouch(View v, MotionEvent event) { final ClipData data = ClipData.newPlainText("position",position + ""); v.startDrag(data, pieceDragShadowBuilder, v, 0); return true; } 

То в моем слушателе его:

  @Override public boolean onDrag(View pV, DragEvent pEvent) { final int dragAction = pEvent.getAction(); View dragView = (View) pEvent.getLocalState(); final FrameLayout container = (FrameLayout) pV; if (dragAction == DragEvent.ACTION_DRAG_STARTED) { } else if (dragAction == DragEvent.ACTION_DRAG_ENTERED) { } else if (dragAction == DragEvent.ACTION_DRAG_EXITED) { } else if (dragAction == DragEvent.ACTION_DROP) { } 

Теперь единственное отличие, которое я вижу от вашего кода, это то, что я onTouch() метод startDrag() в моем onTouch() независимо от конкретных событий MOVE или UP или CANCEL.

Intereting Posts
SimpleXML, org.simpleframework.xml.core.PersistenceException Видео, записанное с Android MediaRecorder, повреждено на Samsung Galaxy S2 Я пишу файл в Environment.DIRECTORY_DOWNLOADS, почему я не вижу его через приложение «Загрузки»? Шифрование и дешифрование в мобильных и .net веб-сервисах API-интерфейс Google Calendar OAuth2 на Android-соте Android ndk-build iostream: нет такого файла или каталога Как реализовать пользовательский вид AlertDialog Запуск apk при загрузке в Android Библиотека изображений Picasso – низкое качество, сохраняя соотношение сторон и размеры изображения Android java.lang.VerifyError? Несколько фрагментов с разным расширяемым списком для одних и тех же данных Вкладки отображаются по-разному в зависимости от того, установлен ли Theme.NoTitleBar или нет в манифесте Слушайте входящие звонки через BroadcastReceiver, без PhoneStateIntentReceiver или PhoneStateListener Как открыть окно SMS в андроиде программно? Веб-просмотр Android подходит для всего содержимого экрана