android - 拖放 API - OnDragListener 问题

标签 android android-fragments drag-and-drop

我正在尝试弄清楚如何执行以下操作:

我有一个 Activity 和一个充当抽屉导航类型的 fragment (右侧)。 在那个抽屉 fragment 里面我有一个 GridView 。 目前,我可以长按该 GridView 中的一个单元格,这将启动 startDrag() 方法。这将创建一个可以移动的拖动阴影对象。一切都根据API。

调用 startDrag 后,我使用接口(interface)调用托管此 fragment 的 Activity ,并要求它关闭抽屉。 所以我留下了 Activity 和当前拖动的 View 在我的手指下。 我的问题是,删除监听器。我尝试将 DragListener 附加到 Activity 的 Root View ,但没有调用任何操作。

我错过了什么吗?这是我使用的代码:

这放入抽屉 fragment 中:

mBlocksGridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int     position, long id) {

            // Get the block's id from adapter
            mBlockId = ((BlockItem) parent.getItemAtPosition(position)).getBlockId();

            // Get the clicked view
            View clickedView = parent.getChildAt(position);

            // Pass blockId in clipdata
            ClipData clipData = ClipData.newPlainText("blockID", String.valueOf(mBlockId));

            // Setup the drag shadow (the bitmap representation of the selected view)
            View.DragShadowBuilder dragShadow = new View.DragShadowBuilder(clickedView);

            // Start the drag mechanism
            clickedView.startDrag(clipData, dragShadow, clickedView, 0);

            mOnItemSingleClickListener.onBlockItemClickedEvent();
            return true;
        }
    });

ClickListener中最后一次调用,mOnItemSingleClickListener.onBlockItemClickedEvent();调用该 Activity 。这是在那里运行的代码:

@Override
    public void onBlockItemClickedEvent() {

    // check if this is a tablet or not
    if (!_isTablet){

        // it's not, so close the palette
        _twoPaneLayout.hideRight();
    }

    setUpOnDragListener();
} 

这是 setUpOnDragListener():

private void setUpOnDragListener() {
        findViewById(R.id.activity_drawing_viewer_root).setOnDragListener(new MyDragEventListener());
}

R.id.activity_drawering_viewer_root 是我的 Activity 中 Root View 的 id。

这是 MyDragEventListener 类...相当简单:

public class MyDragEventListener implements View.OnDragListener {

// This is the method that the system calls when it dispatches a drag event to the
// listener.
public boolean onDrag(View v, DragEvent event) {

    // Defines a variable to store the action type for the incoming event
    final int action = event.getAction();

    // Handles each of the expected events
    switch (action) {

        case DragEvent.ACTION_DRAG_STARTED:
            Log.d("LOGGY5", "DragStarted");
            return true;

        // Im inside the original view's bounds
        case DragEvent.ACTION_DRAG_ENTERED:
            Log.d("LOGGY5", "We're inside original views bounds");
            return true;

        case DragEvent.ACTION_DRAG_LOCATION:

            // Ignore the event
            return true;

        case DragEvent.ACTION_DRAG_EXITED:
            Log.d("LOGGY5", "We existed original views bounds");
            return true;

        case DragEvent.ACTION_DROP:
            Log.d("LOGGY5", "We dropped the shadow view" + event.getX() + ":::" + event.getY());
            return true;

        case DragEvent.ACTION_DRAG_ENDED:
            Log.d("LOGGY5", "Drag ended" + event.getX() + ":::" + event.getY());
            return true;

        // An unknown action type was received.
        default:
            Log.e("DragDrop Example", "Unknown action type received by OnDragListener.");
            break;
    }

    return false;
}

}

问题是拖动监听器永远不会被调用...我必须获取 Activity 中拖动阴影的 X 和 Y 坐标,因此一旦它被放下,我可以调用另一个方法将拖动的项目放置在布局中使用正确的 X,Y 坐标...

谢谢!

最佳答案

好吧,我发现了问题... DragListener 返回 false,这有效地将事件传递到链中,并且自己没有消耗它。

将其更改为 true,监听器变为 Activity 状态。

第一段here 。解释一下。

关于android - 拖放 API - OnDragListener 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25505498/

相关文章:

android - 检测 EditText 的变化(TextWatcher 无效)

java - 如何用起始文本绘制圆弧

android - 如何从 MainActivity 获取当前 fragment

安卓 : Save fragment state and restore the view values

shell - 从 Explorer Shell 拖放到 Virtual TreeView 时如何更改放置提示(Delphi 应用程序)?

android - Retrofit Parsing 中的 url 没有响应

java - Android如何构造与此类似的字节数组

android - 实现一些功能,比如在 Instagram android 应用程序中

javascript - 如何使用 Javascript 将文件添加到现有的 dataTransfer 对象中

javascript - 使用数据属性进行拖放