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()
オーバーロードされた静的なメソッドで、ドロップ ターゲットを指定できます。その
パラメータには次のものがあります。
- 現在の
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);
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 データを含める。DropHelper
は EditText
の 1 つを選択する。
テキストデータを処理する必要があります。選択の基準は、
以下の優先順位で対応してください。
ClipData
がドロップされるEditText
。- テキスト カーソル(キャレット)を含む
EditText
。 - 次の呼び出しに渡される最初の
EditText
。DropHelper.Options.Builder.addInnerEditTexts(EditText...)
。
EditText
をデフォルトのテキストデータ ハンドラとして設定するには、DropHelper.Options.Builder.addInnerEditTexts(EditText...)
の呼び出しの最初の引数として 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
を処理するために作成したクライアント 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 の有無をチェックして、
解決されたデータも含まれます。