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

ImageView拖拽时OnDragListener未触发的问题排查

问题解决:Kotlin中拖拽目标的OnDragListener未触发

你的核心问题是拖拽事件未传递到目标ImageView的OnDragListener,结合Android拖拽机制特性,以下两个关键修改可解决问题:

1. 移除全局拖拽标志

你调用startDragAndDrop时使用了View.DRAG_FLAG_GLOBAL,该标志用于跨应用全局拖拽,而本应用内拖拽无需此设置——它会导致系统优先将事件分发到系统层面,而非本应用内的目标View。将其替换为0(默认本地拖拽)即可:

drawCardImage.setOnLongClickListener { v ->
    val dragShadowBuilder = View.DragShadowBuilder(v)
    val clipData = ClipData.newPlainText("","")
    // 移除全局拖拽标志,使用本地拖拽模式
    v.startDragAndDrop(clipData, dragShadowBuilder, null, 0)
    true
}

2. 确保目标View可交互

默认情况下ImageView的clickable属性为false,而Android拖拽事件仅会分发给可交互的View(即clickable、focusable或longClickable为true的View)。需给目标ImageView添加可交互属性:

val firstHandSecondCard : ImageView = binding.hand1Card2
// 设置View可点击,确保能接收拖拽事件
firstHandSecondCard.isClickable = true
firstHandSecondCard.setOnDragListener { v, e ->
    // 你的原有监听逻辑...
}

额外检查点

  • 确认目标View未被其他布局/View遮挡(可通过布局检查工具查看层级)
  • 确保ACTION_DRAG_STARTED中的MIME类型判断与创建的ClipData匹配(你的代码中MIMETYPE_TEXT_PLAIN和newPlainText是匹配的,无需修改)

修改以上两点后,OnDragListener即可正常接收ACTION_DRAG_STARTED、ACTION_DROP等拖拽事件。

内容的提问来源于stack exchange,提问作者Newps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:50:01