我的问题与 Android 中的拖放 API 有关。如果我的问题令人困惑,我深表歉意。但本质上,当您想要启动拖放操作时,您必须调用startDrag()
. View
你把它传递给一些信息,然后你给它一个OnDragListener
监听View
被拖拽的对象。当开始拖动时,在我的示例中长按,所有可以接受任何信息的视图都向系统注册以接受此信息。如果您快速阅读有关Drag and Drop的 android 文档中的一些内容,这将更有意义。但是,假设您以前没有使用过它并且想要使用它,那么这就是它如何工作的快速概述。
现在我的问题本质上是我遇到的一个问题。我想创建一个View
正在onDragListener
运行的时间,它还接受当前正在拖动的系统信息View
。问题是它不工作。我并不感到惊讶,因为当拖动操作第一次开始时视图没有注册。问题是我如何即时注册它。android 文档向您展示了如何在开始时注册它,而不是在它已经在一个时注册。
MyDragListener(我的 onDragListener 的代码。现在只玩它。)
protected class MyDragListener implements View.OnDragListener {
@Override
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:
// Determines if this View can accept the dragged data
/*The way it works is it essentially turns anything that can accept stuff to Blue
* or whatever color. It also does not need to do anything in terms of showing it can accept anything.*/
if(event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
v.setBackgroundColor(Color.BLUE);
return (true);
} else {
return (false);
}
//break;
case DragEvent.ACTION_DRAG_ENTERED:
v.setBackgroundColor(Color.YELLOW);
Toast.makeText(v.getContext(), "Height is: "+v.getHeight(), Toast.LENGTH_SHORT).show();
return true;
//break;
case DragEvent.ACTION_DRAG_LOCATION:
//this is triggered right after ACTIN_DRAG_ENTERED
Log.d("TestActivity", "Location of the View you are dragging is x: "+event.getX()+" y: "+event.getY());
if(v.getHeight()-10 < event.getY() && v.getHeight() > event.getY()&& showingView == false ) {
//here you are checking if its in the lower bound of the view
LayoutInflater inflater = LayoutInflater.from(v.getContext());
LinearLayout layout = (LinearLayout)inflater.inflate(R.layout.some_text, table, false);
((TextView)layout.findViewById(R.id.da_text)).setText("Some text");
layout.setTag("Empty");
layout.startDrag(ClipData.newPlainText("Empty", "Empty"), new View.DragShadowBuilder(), null, 0);
table.addView(layout, Integer.parseInt(v.getTag().toString())+1);
showingView = true;
}
return true;
case DragEvent.ACTION_DRAG_EXITED:
v.setBackgroundColor(Color.BLUE);
return true;
//break;
case DragEvent.ACTION_DROP:
//this is obvious, gets the data in the view that was dropped
return true;
case DragEvent.ACTION_DRAG_ENDED:
v.setBackgroundColor(Color.WHITE);
return true;
}//end of switch
return false;
}
}//end of MyDragListener
编辑 1
所以我尝试了不同的方法。我决定为我准备一个支架,LinearLayout
这将是TableLayout
. 这样我就可以注册OnDragListener
然后我可以拿着它直到我需要它。那失败了。我第一次使用它,即使我将它添加到 TableLayout 中,它也不会监听任何拖动,但是当我放下拖动然后长按它时,它起作用了。所以它与它不可见的事实有关,然后它不是。因此,默认情况下,当它不可见时它不会做任何事情,我不知道如何让它不会发生,并允许我让它即使在它不可见时也能做一些事情。有任何想法吗?