DropHelper
类可简化
拖放功能的实现DropHelper
是 Jetpack DragAndDrop
库的成员,可向后兼容至 API 级别 24。
您可以使用 DropHelper
来指定拖放目标、自定义拖放目标突出显示,以及定义如何处理用户放下的数据。
设置拖动来源
首先,请创建DragStartHelper
以及拖动源代码视图
OnDragStartListener
。
在OnDragStartListener
中,
替换方法 onDragStart()
。创建一个 ClipData
对象
以及要移动的数据的 ClipData.Item
对象。作为ClipData
的一部分,
提供存储在 ClipDescription
对象中的元数据,
ClipData
。对于不表示数据移动的拖放操作
您可能希望使用 null
而非实际对象。
Kotlin
DragStartHelper(draggableView) { view: View, _: DragStartHelper -> val item = ClipData.Item(view.tag as? CharSequence) val dragData = ClipData( view.tag as? CharSequence, arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN), item ) view.startDragAndDrop( dragData, View.DragShadowBuilder(view), null, 0 ) }.attach()
Java
new DragStartHelper(draggableView, new DragStartHelper.OnDragStartListener() { @Override public void onDragStart(View view, DragStartHelper helper) { CharSequence tag = (CharSequence) view.getTag(); ClipData.Item item = new ClipData.Item(tag); ClipData dragData = new ClipData( tag, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item); view.startDragAndDrop( dragData, new View.DragShadowBuilder(view), null, 0); } });
指定拖放目标
当用户将阴影释放到视图上时,需要配置视图 正确接受数据并作出正确响应。
DropHelper.configureView()
是一种静态的重载方法,可让您指定拖放目标。其
参数包括:
- 当前的
Activity
- 用于 URI 权限。 - 拖放目标的配置选项,特别是
嵌入式
EditText
字段。 OnReceiveContentListener
处理用户放下的数据
例如,若要创建能够接受图片的拖放目标,请使用以下方法调用之一:
Kotlin
configureView( myActivity, targetView, arrayOf("image/*"), options, onReceiveContentListener) // or configureView( myActivity, targetView, arrayOf("image/*"), onReceiveContentListener)
Java
DropHelper.configureView( myActivity, targetView, new String[] {"image/*"}, options, onReceiveContentlistener); // or DropHelper.configureView( myActivity, targetView, new String[] {"image/*"}, onReceiveContentlistener);
第二个调用省略了拖放目标配置选项,在这种情况下,
拖放目标突出显示颜色设为主题的次要(或强调色)颜色,
突出显示圆角半径设置为 16 dp,并且 EditText
列表
组件为空。如需了解详情,请参阅下一部分。
配置拖放目标
DropHelper.Options
inner 类可让您配置拖放目标。提供类的实例
DropHelper.configureView(Activity, View, String[], Options,
OnReceiveContentListener
)
方法。如需了解详情,请参阅上一部分。
自定义拖放目标突出显示
DropHelper
用于配置拖放目标,以便在用户将内容拖动到目标上时突出显示。DropHelper
提供默认样式,
通过 DropHelper.Options
,您可以设置突出显示颜色,并指定
突出显示矩形的角半径。
使用
DropHelper.Options.Builder
类来创建 DropHelper.Options
实例并设置配置选项,
如以下示例中所示:
Kotlin
val options: DropHelper.Options = DropHelper.Options.Builder() .setHighlightColor(getColor(R.color.purple_300)) .setHighlightCornerRadiusPx(resources.getDimensionPixelSize(R.dimen.drop_target_corner_radius)) .build()
Java
DropHelper.Options options = new DropHelper.Options.Builder() .setHighlightColor(getColor(R.color.purple_300)) .setHighlightCornerRadiusPx(getResources().getDimensionPixelSize(R.dimen.drop_target_corner_radius)) .build();
处理拖放目标中的 EditText 组件
当拖放目标包含以下内容时,DropHelper
还会控制拖放目标内的焦点
可编辑的文本字段
拖放目标可以是单个视图,也可以是视图层次结构。如果拖放目标视图
层次结构包含一个或多个 EditText
组件,请提供
DropHelper.Options.Builder.addInnerEditTexts(EditText...)
,以确保拖放目标突出显示和文本数据处理正常工作。
DropHelper
可防止拖放目标视图中出现 EditText
组件
防止在拖动交互期间从包含视图窃取焦点。
此外,如果拖放图标 ClipData
包含文本和 URI 数据,DropHelper
会从以下 EditText
中选择一个
组件来处理文本数据。选择依据的是
以下优先顺序:
ClipData
被放到的EditText
。- 包含文本光标(脱字符号)的
EditText
。 - 向以下调用提供的第一个
EditText
:DropHelper.Options.Builder.addInnerEditTexts(EditText...)
。
如需将 EditText
设为默认的文本数据处理程序,请将 EditText
作为调用 DropHelper.Options.Builder.addInnerEditTexts(EditText...)
时使用的第一个参数进行传递。例如,如果拖放目标可处理图片,但包含可修改的文本字段 T1
、T2
和 T3
,则请按如下所示将 T2
设为默认值:
Kotlin
val options: DropHelper.Options = DropHelper.Options.Builder() .addInnerEditTexts(T2, T1, T3) .build()
Java
DropHelper.Options options = new DropHelper.Options.Builder() .addInnerEditTexts(T2, T1, T3) .build();
处理拖放目标中的数据
DropHelper.configureView()
方法接受 OnReceiveContentListener
用于处理拖放 ClipData
。拖放数据
以
ContentInfoCompat
对象。
对象中存在文本数据。图片等媒体由
URI。
OnReceiveContentListener
还会处理由以下元素提供给拖放目标的数据:
拖放操作之外的其他用户互动(例如复制和
粘贴 - 使用 DropHelper.configureView()
配置以下内容时
视图类型:
- 所有视图(如果用户搭载的是 Android 12 或更高版本)。
AppCompatEditText
、 如果用户运行的是 Android 7.0 以下的版本。
MIME 类型、权限和内容验证
DropHelper
进行的 MIME 类型检查基于拖放操作
ClipDescription
,
该对象由提供拖放数据的应用创建。验证
ClipDescription
,以确保 MIME 类型设置正确。
DropHelper
会请求
拖放ClipData
。如需了解详情,请参阅
DragAndDropPermissions
。通过
权限可让您在处理拖放操作时解析内容 URI,
数据。
在以下情况下,DropHelper
不会验证 content provider 返回的数据:
解析用户放下的数据中的 URI。检查是否存在 null 并验证
任何已解析的数据