[英]How to make a view accept drop event in android4.0?
In my app I want to design a view group. 在我的应用中,我想设计一个视图组。 If a add some content such as a textview into this view group, the textview can accept DragEvent .
如果将一些内容(例如textview)添加到此视图组,则textview可以接受DragEvent 。 I tried it using the code below
我尝试使用下面的代码
@Override
public void addView(View child) {
super.addView(child);
child.setOnDragListener(new ViewDragger());
child.setOnLongClickListener(new DragStarter()) ;
}
class DragStarter implements OnLongClickListener{
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence) v.getTag());
ClipData dragData = new ClipData((CharSequence) v.getTag(),new String[]{"*/*"},item);
View.DragShadowBuilder builder = new View.DragShadowBuilder(v);
boolean started = v.startDrag(dragData, builder, v , 0) ;
System.out.println("start drag " + started+" " + v );
return false;
}
}
class ViewDragger implements OnDragListener{
@Override
public boolean onDrag(View v, DragEvent event) {
if(event.getAction() == DragEvent.ACTION_DRAG_ENDED){
System.out.println("drag end");
}
if(event.getAction() == DragEvent.ACTION_DRAG_ENTERED){
System.out.println("drag entered.");
}
if(event.getAction() == DragEvent.ACTION_DRAG_EXITED){
System.out.println("drag existed.");
}
if(event.getAction() == DragEvent.ACTION_DRAG_LOCATION){
System.out.println("drag location");
}
if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){
System.out.println("drag started.");
}
if(event.getAction() == DragEvent.ACTION_DROP){
System.out.println("action drop");
return true ;
}
System.out.println("view-->" + v);
return false;
}
}`
But functions do not run as I expected. 但是功能不能按我预期的那样运行。 All DragListeners are involked when I long-click one textview, and only "drag started" and "drag end" are printed.
长按一个textview时,所有的DragListener都会被卷入,并且仅显示“拖动开始”和“拖动结束”。 I read the demo in APIDemo, but I want the drag event can be used for a usual widget.
我阅读了APIDemo中的演示,但是我希望drag事件可以用于普通的小部件。 Any advice?
有什么建议吗? THX
谢谢
The reason it's not working is because you didn't respond true when you received ACTION_DRAG_STARTED. 它不起作用的原因是,当您收到ACTION_DRAG_STARTED时,您没有回答true。
if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){
System.out.println("drag started.");
return true;
}
Add the return true when you get the started event and you will register to listen for future drag events by that object. 当您获得启动事件时,添加return true,您将注册以侦听该对象将来的拖动事件。
I added an image view in my activity and used to drag and drop in specific position. 我在活动中添加了图像视图,并用于拖放到特定位置。 And set the drag listener to layout.
并将拖动侦听器设置为布局。
public class MainActivity extends Activity
{
private ImageView image;
private AbsoluteLayout my;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
my=(AbsoluteLayout)findViewById(R.id.my);
image =(ImageView)findViewById(R.id.imageView1);
my.setOnDragListener(new View.OnDragListener()
{
@Override
public boolean onDrag(View v, DragEvent event) {
if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){
System.out.println("drag started.");
return true;
}
if(event.getAction()==DragEvent.ACTION_DROP)
{
image.setX(event.getX());
image.setY(event.getY());
System.out.println("DROP ENTERED");
return true;
}
else
return false;
}
});
image.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
View.DragShadowBuilder bu=new View.DragShadowBuilder(v);
ClipData clp=ClipData.newPlainText("", "");
v.startDrag(clp,bu,(ImageView)v,0);
return true;
}
else
return false;
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.