Search code examples
androiddrag-and-dropandroid-linearlayoutabsolutelayout

How to access paren (LinearLayout) t of view during DragAndDrop using DragEvent.getLocalState()?


enter image description here

As illustrated above, I have 3 LinearLayouts, each has an ImageView and a TextView inside them. Each Image view has an OnLongClickListener attached to them. The AbsoluteLayout which encapsulates all the objects has an OnDragListener attached to it.

Inside the onDrag method I need to get the LinearLayout that is the parent of the ImageView that I am dragging so that I can reposition the entire LinearLayout setting the top and left margins.

I wrote the following code hoping I could access the parent LinearLayout but got no success.

@Override
public boolean onDrag(View view, DragEvent event) {
if(event.getAction() == DragEvent.ACTION_DROP){
View v = (View) event.getLocalState();
ImageView iv = (ImageView) v;
ViewParent parent = iv.getParent();
LinearLayout l;
if (parent == null) {
     Log.d("TEST", "this.getParent() is null");
}
else {
      if (parent instanceof ViewGroup) {
           ViewParent grandparent = ((ViewGroup) parent).getParent();
           if (grandparent == null) {
                 Log.d("TEST", "((ViewGroup) this.getParent()).getParent() is null");
                        }
       else {
            if (parent instanceof AbsoluteLayout) {
                l = (LinearLayout) grandparent;
               Log.d("TEST","Successfully acquired linear layout");
                            }
                            else {
                                Log.d("TEST", "((ViewGroup) this.getParent()).getParent() is not a RelativeLayout");
                            }
                        }
                    }
                    else {
                        Log.d("TEST", "this.getParent() is not a ViewGroup");
                    }
                }}

Solution

  • Turns out it was as easy as doing the following

    @Override
    public boolean onDrag(View view, DragEvent event) {
        String TAG = "DragDrop";
        switch (event.getAction()) {
            case DragEvent.ACTION_DROP: {
                View v = (View) event.getLocalState();
                ImageView iv = (ImageView) v;
    
                ViewParent parent = iv.getParent();
                LinearLayout l = (LinearLayout) parent;
                AbsoluteLayout.LayoutParams params = (AbsoluteLayout.LayoutParams)l.getLayoutParams();
                x = (int) event.getX() - (l.getWidth() / 2);
                y = (int) event.getY() - (l.getHeight() / 2) + 30;
                params.x = x;
                params.y = y;
                l.setLayoutParams(params);
    
                iv.setVisibility(iv.VISIBLE);
                //boardName.setVisibility(View.VISIBLE);
    
                break;
            }
        }
        return true;
    }