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 并验证
任何已解析的数据