【发布时间】:2014-08-26 12:09:51
【问题描述】:
我正在尝试弄清楚如何执行以下操作:
我有一个活动和一个片段作为一种导航抽屉(右侧)。 在那个抽屉片段里面,我有一个网格视图。 目前,我可以长按该网格视图中的一个单元格,这将启动 startDrag() 方法。这将创建一个可以移动的拖动阴影对象。全部根据 API。
调用 startDrag 后,我使用接口调用承载此片段的活动,并要求它关闭抽屉。 因此,我留下了活动和当前拖动的视图。 我的问题是,drop 监听器。我尝试将 DragListener 附加到活动的根视图,但没有调用任何操作。
我错过了什么吗?这是我使用的代码:
这在抽屉片段中:
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();调用活动。这是在那里运行的代码:
@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 是我活动中根视图的 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;
}
}
问题是拖动监听器永远不会被调用...我必须在活动中获取拖动阴影的 X 和 Y 坐标,所以一旦它被放下,我可以调用另一个方法,将拖动的项目放置在布局中使用正确的 X,Y 坐标...
谢谢!
【问题讨论】:
标签: android android-fragments drag-and-drop