You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:20:33