Android开发如何禁用EditText拖放时的高亮效果
根本原因
仅修改DropHelper.Options.Builder的setHighlightColor参数,只能控制DropHelper组件自行绘制的悬浮高亮层,无法覆盖EditText原生自带的拖放状态反馈。两者是完全独立的绘制逻辑:DropHelper的高亮是拖放框架额外叠加的Drawable,而EditText的拖放高亮是控件自身在接收到拖入事件时,默认触发的状态背景、文本插入位置提示两层反馈,单独修改DropHelper配置无法关闭这部分效果。
彻底禁用方案
按以下步骤配置即可完全移除所有拖放高亮,不会影响正常拖放功能:
- 调整DropHelper基础配置,关闭组件自带的高亮层
除了将高亮色设为透明,还要把高亮层的内边距设为0,让DropHelper的高亮层无有效绘制区域,不会在界面上渲染:val dropOptions = DropHelper.Options.Builder() .setHighlightColor(Color.TRANSPARENT) // 四个方向内边距全部置0,禁用DropHelper自身的高亮层绘制 .setHighlightInsets(0, 0, 0, 0) .build() - 拦截拖放事件,禁用EditText原生拖放高亮
配置DropHelper时追加自定义拖放监听,在拖入过程中临时关闭EditText的高亮逻辑,拖放结束后恢复原有配置,避免影响正常选中文本、点击输入的高亮效果:DropHelper.configureView( this, binding.etTarget, arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN), // 替换为实际业务支持的MIME类型 dropOptions ) { v, event -> val targetEt = v as EditText when (event.action) { DragEvent.ACTION_DRAG_ENTERED, DragEvent.ACTION_DRAG_LOCATION -> { // 临时替换高亮色为透明,关闭默认焦点高亮 targetEt.highlightColor = Color.TRANSPARENT targetEt.defaultFocusHighlightEnabled = false } DragEvent.ACTION_DROP, DragEvent.ACTION_DRAG_ENDED -> { // 恢复原有高亮配置,不影响正常选中文本的显示效果 targetEt.highlightColor = getColor(R.color.default_text_highlight) targetEt.defaultFocusHighlightEnabled = true } } // 返回false保证DropHelper默认的拖放接收逻辑正常执行 false } - (可选)适配Material组件场景
如果使用的是Material组件库的TextInputEditText,需要在对应TextInputLayout的样式中追加配置,关掉Material组件自带的状态层高亮:<style name="NoDragHighlightTextInput" parent="Widget.MaterialComponents.TextInputLayout.FilledBox"> <item name="dragHoveredSlidelineColor">@android:color/transparent</item> </style>
不想在拖放配置里写额外逻辑的话,也可以自定义EditText控件,重写
onDragEvent方法在拖入时临时替换高亮色,所有使用这个自定义控件的场景都不会出现拖放高亮,复用性更高。自定义控件核心代码参考:class NoHighlightEditText @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : AppCompatEditText(context, attrs) { override fun onDragEvent(event: DragEvent?): Boolean { when(event?.action) { DragEvent.ACTION_DRAG_ENTERED, DragEvent.ACTION_DRAG_LOCATION -> { highlightColor = Color.TRANSPARENT } DragEvent.ACTION_DROP, DragEvent.ACTION_DRAG_ENDED -> { highlightColor = context.getColor(R.color.default_text_highlight) } } return super.onDragEvent(event) } }
内容的提问来源于stack exchange,提问作者Misaki Scarlet
相关产品推荐
相关产品推荐

