我正在尝试弄清楚如何执行以下操作:
我有一个 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/