首页 > 解决方案 > Android 9 Pie 中的拖放崩溃

问题描述

当我在 Android 9 Pie 上试用我的应用程序时,我无法让拖放功能与以前的版本一样工作。基本上发生的情况是调用 event.getLocalState() 返回 null。这仅在 Android 9 上发生。代码段:

protected final class DragListener implements View.OnDragListener {

    @Override
    public boolean onDrag(View v, DragEvent event) {

        // Here I get null
        final NumberButton draggedButton = (NumberButton) event.getLocalState();
    }
}

我在 OnTouchListener 中初始化拖动:

protected class MyTouchListener implements View.OnTouchListener {

    private float pressedY;
    private float pressedX;

    @Override
    public boolean onTouch(final View view, MotionEvent motionEvent) {

        NumberButton draggedButton = (NumberButton) view;

        if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
            // DOING SOMETHING HERE
            return true;
        } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
            if (getMoveDistance(motionEvent, pressedX, pressedY) >= 10) {
                draggedButton.markSelected();
                View.DragShadowBuilder shadowBuilder = new Utils.ButtonDragShadowBuilder(view, motionEvent.getX(), motionEvent.getY());
                try {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        view.startDragAndDrop(null, shadowBuilder, draggedButton, 0);
                    } else {
                        view.startDrag(null, shadowBuilder, draggedButton, 0);
                    }
                } catch (IllegalStateException e) {
                    Log.e("Number button", e.getLocalizedMessage());
                    return false;
                }
            }
        }
    }
}

通过查看源代码,我发现 startDragAndDrop 在 Android 8 和 9 中有不同的实现。

首先,任何线索为什么会发生这种情况?

其次,更重要的是,如何解决/解决这个问题?拖放是我的应用程序的关键部分,我希望它可以在最新的 Android 上运行。

感谢帮助

标签: androiddrag-and-dropandroid-9.0-pie

解决方案


看起来这在 7 月被报告为错误。那时,在发布的 Android 9.0 中解决可能为时已晚,而且不太可能通过安全补丁修复。

就解决方法而言,假设一次只有一次拖动,您应该能够跟踪当前拖动正在其他地方拖动的内容(例如,活动/片段/视图模型中的字段)。


推荐阅读