ドラッグ&ドロップを簡単にする DropHelper

DropHelper クラスは、 ドラッグ&ドロップ機能の実装などです。Jetpack の DragAndDrop ライブラリのメンバーである DropHelper は、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);

2 番目の呼び出しでは、ドロップ ターゲットの構成オプションが省略されています。この場合、 ドロップ ターゲットのハイライト色がテーマのセカンダリ カラー(アクセント カラー)に設定されている ハイライトの角の半径が 16 dp に設定され、EditText のリストが コンポーネントが空です。詳しくは、次のセクションをご覧ください。

ドロップ ターゲットを構成する

DropHelper.Options 内部クラスを使用すると、ドロップ ターゲットを設定できます。クラスのインスタンスを 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 はドロップ ターゲット内のフォーカスも制御します。 追加することもできます。

ドロップ ターゲットは単一のビューまたはビュー階層のいずれかです。ドロップ ターゲット ビューが 階層に 1 つ以上の EditText が含まれている 構成するには、構成するコンポーネントのリストを DropHelper.Options.Builder.addInnerEditTexts(EditText...) ドロップ ターゲットのハイライト表示とテキストデータ処理が正しく機能することを確認します。

DropHelper: ドロップ ターゲット ビュー内で EditText コンポーネントを禁止 ドラッグ インタラクション中に、含まれるビューからフォーカスが盗まれることを防げます。

また、ドラッグ&ドロップ ClipData テキストと URI データを含める。DropHelperEditText の 1 つを選択する。 テキストデータを処理する必要があります。選択の基準は、 以下の優先順位で対応してください。

  1. ClipData がドロップされる EditText
  2. テキスト カーソル(キャレット)を含む EditText
  3. 次の呼び出しに渡される最初の EditTextDropHelper.Options.Builder.addInnerEditTexts(EditText...)

EditText をデフォルトのテキストデータ ハンドラとして設定するには、DropHelper.Options.Builder.addInnerEditTexts(EditText...) の呼び出しの最初の引数として 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 を処理するために作成したクライアント ID を使用します。ドラッグ&ドロップ データは リスナーに提供されます。 ContentInfoCompat オブジェクト。 テキストデータはオブジェクト内に存在します。画像などのメディアは、 URI などです。

OnReceiveContentListener は、ドロップ ターゲットに提供されたデータも次の方法で処理します。 ドラッグ&ドロップ以外のユーザー操作(コピーや 貼り付け(DropHelper.configureView() を使用して以下を構成する場合) 次の種類があります。

  • すべてのビュー(ユーザーが Android 12 以降を使用している場合)。
  • AppCompatEditText ユーザーが使用している Android のバージョンが 7.0 以前の場合。
で確認できます。

MIME タイプ、権限、コンテンツの検証

DropHelper による MIME タイプの確認は、ドラッグ&ドロップに基づいて行われます。 ClipDescription: (ドラッグ&ドロップ データを提供するアプリによって作成されます)検証 ClipDescription: MIME タイプが正しく設定されていることを確認します。

DropHelper は、 ClipData をドラッグ&ドロップします。詳細については、次をご覧ください: DragAndDropPermissions。「 権限を使用すると、ドラッグ&ドロップの処理中にコンテンツ URI を解決できます。 分析できます

DropHelper は、次の場合にコンテンツ プロバイダから返されたデータを検証しません。 データ内の URI を解決できます。null の有無をチェックして、 解決されたデータも含まれます。