DragEvent.ACTION_DROP никогда не вызывается

Я пытаюсь использовать перетаскивание изображения в приложении для Android. Моя проблема в том, что DragEvent.ACTION_DROP никогда не вызывается, когда я перестаю перетаскивать изображение.

В моем лог-коте я получаю этот вызов:

01-30 13:50:25.003: I/ViewRootImpl(2198): Reporting drop result: false

Спасибо за помощь.

Вот мой код:

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);
 }
}

Мой 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>

1 ответ

У вас должно быть что-то, чтобы отбросить это изображение. Пока у вас есть только OnDragListener на самом изображении. Точка, в которую вы хотите удалить это изображение, не содержит никакого контроля с помощью OnDragListener, поэтому ваш прослушиватель не будет вызываться.

Элементы управления, которые прослушивают OnDragListeners, не могут быть невидимыми или уйти, поэтому вам нужно разместить какую-то сетку там, где ячейки выглядят пустыми, но нет. Например, ImageView с прозрачным изображением. Или с Alpha, установленным в 0f.

По крайней мере, установите OnDragListener в свой внутренний LinearLayout, тогда вы получите события Drop.

licensed under cc by-sa 3.0 with attribution.