Image dis-appears on droppping imageview android

62 views Asked by At

I am trying simple drag and drop program for android. I referred various material on internet for it. The problem is I am able to drag the image properly but as and when I drop it, It disappears. Below is the code..

package com.example.vishal_raj.dragndrop;

    import android.app.Activity;
    import android.content.ClipData;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.DragEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.DragShadowBuilder;
    import android.view.View.OnDragListener;
    import android.view.View.OnTouchListener;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.RelativeLayout;
    public class MainActivity extends Activity {
        public String msg;
        private View selected_item = null;
        private int offset_x = 0;
        private int offset_y = 0;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findViewById(R.id.img).setOnTouchListener(new MyTouchListener());
            }
        }

    final class MyTouchListener implements View.OnTouchListener {
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                view.startDrag(data, shadowBuilder, view, 0);
                view.setVisibility(View.INVISIBLE);
                return true;
            } else {
                return false;
            }
        }
    }

    class MyDragListener implements View.OnDragListener {
        private LinearLayout.LayoutParams layoutParams;

        @Override
        public boolean onDrag(View v, DragEvent event) {
            int action = event.getAction();
            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_STARTED:
                    break;
                case DragEvent.ACTION_DRAG_ENTERED:
                    break;
                case DragEvent.ACTION_DRAG_EXITED:
                    break;
                case DragEvent.ACTION_DROP:

                    View view = (View) event.getLocalState();
                    ViewGroup owner = (ViewGroup) view.getParent();
                    owner.removeView(view);
                    LinearLayout container = (LinearLayout) v;
                    container.addView(view);
                    view.setVisibility(View.VISIBLE);
                    break;
                case DragEvent.ACTION_DRAG_ENDED:
                    break;
                default:
                    break;
            }
            return true;
        }
    }

And below is the xml file

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
        android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

        <LinearLayout
            android:layout_width="400dp"
            android:layout_height="400dp">

            <ImageView
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:id="@+id/img"
                android:src="@drawable/abc"/>

        </LinearLayout>

    </RelativeLayout>
1

There are 1 answers

0
yshahak On

It is very nice you wrote the class

MyDragListener

But you didn't assign it to any view so basically it onDrag() method never called. There isn't any view in your layout that accept any drag event because any view not register to those events or implements is own onDragEvent()

You need to add something like:

findViewById(R.id.your_desire_view_that_accept_events).setOnDragListener(new MyDragListener ());