android – DragEvent.ACTION_ Drop will never be called
I tried to use image drag on my Android application. My problem is that dragevent.action will never be called when I stop dragging my image_ DROP.
In my diary, I received this call:
01-30 13:50:25.003: I/ViewRootImpl(2198): Reporting drop result: false
Thanks for your help.
This is my code:
public class buildImage extends Activity implements OnTouchListener, OnDragListener
{
private LinearLayout slider;
private RelativeLayout board;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.build_image);
//drawing = (Signatureviewmoded) findViewById(R.id.myTest);
slider = (LinearLayout) findViewById(R.id.imageSlider);
board = (RelativeLayout) findViewById(R.id.borad);
setImagesSlider();
}
public void setImagesSlider()
{
ImageView image = new ImageView(this);
image.setLayoutParams(new LinearLayout.LayoutParams(100, 100));
Drawable draw = getResources().getDrawable(R.drawable.images);
image.setImageDrawable(draw);
image.setOnDragListener(this);
image.setOnTouchListener(this);
slider.addView(image);
}
@Override
public boolean onTouch(View view, MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("tests", "test");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
//view.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
@Override
public boolean onDrag(View v, DragEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
{
Log.i("check6", "check6");
// do nothing
return true;
}
case DragEvent.ACTION_DRAG_ENTERED:
{
Log.i("check4", "check4");
//v.setBackgroundDrawable(enterShape);
return true;
}
case DragEvent.ACTION_DRAG_EXITED:
{
// v.setBackgroundDrawable(normalShape);
Log.i("check3", "check3");
return true;
}
case DragEvent.ACTION_DROP:
// Dropped, reassign View to ViewGroup
Log.i("check", "check");
addNewImage(event);
return true;
case DragEvent.ACTION_DRAG_ENDED:
{
Log.i("check2", "check2");
// addNewImage(event);
return true;
}
default:
break;
}
return true;
}
public void addNewImage(DragEvent event)
{
ImageView image = new ImageView(this);
image.setLayoutParams(new LinearLayout.LayoutParams(100, 100));
Drawable draw = getResources().getDrawable(R.drawable.images);
image.setImageDrawable(draw);
board.addView(image);
float x = event.getX();
float y = event.getY();
image.setX(x);
image.setY(y);
Log.i("margin", "x " + x + " y " + y);
}
}
My XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:id="@+id/borad"
android:background="@android:color/darker_gray"
android:layout_above="@+id/temp"
android:layout_height="fill_parent" >
</RelativeLayout>
<ScrollView
android:layout_width="fill_parent"
android:id="@+id/temp"
android:layout_alignParentBottom="true"
android:layout_height="wrap_content" >
<LinearLayout
android:id="@+id/imageSlider"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
</ScrollView>
</RelativeLayout>
resolvent:
You must have something to put down that image. So far, you only have one ondraglistener on the image. The location where you want to delete the image does not contain any controls of ondraglistener, so your listener will not be called
The control listening to ondraglisteners cannot be hidden or disappeared, so you must place some grids there, where the cells look empty but not. For example, ImageView with transparent image. Or set alpha to 0f
At least set ondraglistener to internal LinearLayout, and then you will get the drop event