Что-нибудь изменилось с Drag and Drop в Android 10? - PullRequest
0 голосов
/ 19 сентября 2019

В моем приложении есть функция перетаскивания, которая позволяет пользователю перемещать изображения карт на экране.Эта функциональность работала на всех устройствах до тех пор, пока она не была протестирована на устройстве Pixel под управлением Android 10. Теперь DragShadow касающегося объекта иногда остается и выходит из приложения.Изображение остается на экране даже после закрытия приложения и даже после удаления приложения.Только полная перезагрузка устройства очистит изображения.

Я, очевидно, сначала заподозрил свой код, но, поскольку imageViews отключены от среды приложения, я теперь подозреваю что-то в системе RunTime Android 10.

Любые идеи будут с благодарностью.Я могу опубликовать код, если необходимо, но этот класс составляет около 3000 строк, поэтому я не буду публиковать все это.

enter image description here

1 Ответ

0 голосов
/ 21 сентября 2019

Теперь он записан в Google как ошибка и назначен для просмотра: Отчет об ошибках перетаскивания

Вот обходной путь, который стабилизирует приложение, чтобы люди могли его использовать иэто может быть даже вполне приемлемым решением для некоторых разработчиков, если они довольны изменениями пользовательского интерфейса.

Используйте OnLongClickListener вместо OnTouchListener, чтобы начать перетаскивание.Первоначально пользователь мог касаться и перетаскивать, и теперь они должны долго нажимать.При необходимости оставьте onTouch для выполнения некоторых других задач с помощью View, но переместите материал startDrag в onLongClickHandler.Например:

public boolean onLongClick(View v) {
        //...
        // get the card ready for dragging
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
        shadowBuilder.getView().setAlpha(1.0f);
        // deprecated. use startDragAndDrop but need minimum SDK to be 24
        // the original position is sent as LocalState (third argument)
        if (v.startDrag(null, shadowBuilder, position, 0)) {
            // make the moving view's old position appear invisible since
            // its replaced by the drag shadow
            v.setAlpha(0f);
        }
        return true;
    }

Когда startDrag запускался из onLongClick вместо onTouch, проблема полностью исчезла без каких-либо других изменений.Это не исправление, так как должна быть возможность начать перетаскивание из onTouchListener.

...