用于简化拖放的 DropHelper

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() 是一种静态的重载方法,可让您指定拖放目标。其 参数包括:

例如,若要创建能够接受图片的拖放目标,请使用以下方法调用之一:

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 中选择一个 组件来处理文本数据。选择依据的是 以下优先顺序:

  1. ClipData 被放到的 EditText
  2. 包含文本光标(脱字符号)的 EditText
  3. 向以下调用提供的第一个 EditTextDropHelper.Options.Builder.addInnerEditTexts(EditText...)

如需将 EditText 设为默认的文本数据处理程序,请将 EditText 作为调用 DropHelper.Options.Builder.addInnerEditTexts(EditText...) 时使用的第一个参数进行传递。例如,如果拖放目标可处理图片,但包含可修改的文本字段 T1T2T3,则请按如下所示将 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 并验证 任何已解析的数据