Android Studio中OnDragListener不生效:触摸正常但拖拽完全无效
自定义View拖拽无响应的修复方案
问题根源
你的代码仅设置了OnDragListener,但未在触摸事件中主动触发拖拽启动流程——Android系统不会自动将触摸操作转为拖拽事件,必须手动调用拖拽启动方法才能让OnDragListener收到回调。此外当前OnTouchListener返回false,虽不直接导致拖拽失效,但如果需要拦截触摸事件,需根据场景调整返回值。
修复后的代码
public class NavMap extends View { public NavMap(Context c) { super(c); OnTouchListener touch = (view, motionEvent) -> { Log.i("I", "Touch"); // 在触摸按下时启动拖拽流程 if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { // 创建拖拽数据(示例用空数据,可按需传入实际业务数据) ClipData clipData = ClipData.newPlainText("", ""); // 适配不同API版本的拖拽启动方法 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { startDragAndDrop(clipData, new View.DragShadowBuilder(this), null, 0); } else { startDrag(clipData, new View.DragShadowBuilder(this), null, 0); } } // 返回true表示消费触摸事件,避免父View拦截导致拖拽启动失败 return true; }; OnDragListener drag = (view, dragEvent) -> { Log.i("I", "Drag"); // 可根据拖拽事件类型做对应处理 switch (dragEvent.getAction()) { case DragEvent.ACTION_DRAG_STARTED: Log.i("I", "拖拽开始"); break; case DragEvent.ACTION_DRAG_LOCATION: Log.i("I", "拖拽中位置变化"); break; case DragEvent.ACTION_DRAG_ENDED: Log.i("I", "拖拽结束"); break; } return true; }; setOnDragListener(drag); setOnTouchListener(touch); } }
关键改动说明
- 在
ACTION_DOWN触摸事件中调用startDragAndDrop()/startDrag(),这是触发拖拽流程、让OnDragListener收到回调的核心操作。 - 调整
OnTouchListener返回true,确保触摸事件被当前View消费,避免父View拦截导致拖拽启动逻辑无法执行。 - 添加拖拽事件类型判断,方便针对拖拽的不同阶段(开始、位置变化、结束)做业务处理。
内容的提问来源于stack exchange,提问作者Kai Kishpaugh
相关产品推荐
相关产品推荐

