Класс 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 позволяет настраивать цели перетаскивания. Передайте экземпляр класса в метод 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 также управляет фокусом в целевом объекте, если он содержит редактируемые текстовые поля.
Целью перетаскивания может быть одно представление или иерархия представлений. Если иерархия View целевого объекта содержит один или несколько компонентов EditText, предоставьте список компонентов для DropHelper.Options.Builder.addInnerEditTexts(EditText...), чтобы обеспечить правильную работу выделения целевого объекта и обработки текстовых данных.
DropHelper не позволяет компонентам EditText в иерархии представлений целевого объекта перехватывать фокус у содержащего представления во время перетаскивания.
Кроме того, если перетаскиваемый объект ClipData содержит текст и URI, DropHelper выбирает один из компонентов EditText в целевом объекте для обработки текста. Выбор осуществляется в следующем порядке приоритета:
EditText, на который перетаскиваетсяClipData.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-типы, разрешения и проверка контента
Проверка MIME-типов в DropHelper основана на объекте ClipDescription, который создается приложением, предоставляющим данные для перетаскивания. Проверьте ClipDescription, чтобы убедиться, что MIME-типы заданы правильно.
DropHelper запрашивает все разрешения на доступ к URI контента, содержащимся в перетаскиваемом объекте ClipData. Дополнительную информацию вы найдете в статье DragAndDropPermissions. Разрешения позволяют разрешать URI контента при обработке данных перетаскивания.
DropHelper не проверяет данные, возвращаемые поставщиками контента при разрешении URI в перетаскиваемых данных. Проверьте, нет ли нулевых значений, и убедитесь, что все данные верны.