Search code examples
javaandroiddrag-and-droponlongclicklistener

Android - Dragging with a LongClickListener instead of OnTouch?


How can I get my ImageButton to drag with a LongClickListener instead of an OnTouchListener? I need the button to perform an Action OnClick and when I click it, it thinks I'm starting a drag.

I tried some StackoverFlow answers and nothing has worked.

So, this is my code to start the drag:

homeView.setOnDragListener(new IconDragListener());
ll.setOnTouchListener(new MyTouchListener());
...
class IconDragListener implements View.OnDragListener{

    @Override
    public boolean onDrag(View v, DragEvent event) {
        GridLayout gridLayout = (GridLayout) v.findViewById(R.id.middleGrid);
        final int action = event.getAction();
        switch (action) {
            case DragEvent.ACTION_DRAG_STARTED:
                // do nothing
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                //On drag entered

            case DragEvent.ACTION_DROP:
                if (event.getAction()==DragEvent.ACTION_DROP) {
                    View view = (View) event.getLocalState();
                    ViewGroup from = (ViewGroup) view.getParent();
                    from.removeView(view);
                    GridLayout to = (GridLayout) v;
                    to.addView(view);
                    view.setVisibility(View.VISIBLE);
                    //deleteAreaForAdapter.setVisibility(View.INVISIBLE);
                    deleteAreaForAdapter.setAnimation(slide_out);
                }
                return true;
            case DragEvent.ACTION_DRAG_ENDED:
                //do nothing
            default:
                break;
        }
        return true;
    }

...

// Touch Listener, I'd like this to be OnLongClick
private final class MyTouchListener implements View.OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent e) {
        if (e.getAction() == MotionEvent.ACTION_DOWN) {
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
            v.startDrag(null, shadowBuilder, v, 0);
            deleteAreaForAdapter.setVisibility(View.VISIBLE);
            deleteAreaForAdapter.startAnimation(slide_in);
            v.setVisibility(View.INVISIBLE);
            return true;
        } else {
            return false;
        }
    }
}

Thanks!


Solution

  • Put you code in setOnLongClickListener of ImageButton

    ImageButton.setOnLongClickListener(new OnLongClickListener() {
    
                @Override
                public boolean onLongClick(View v) {
                    View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
                    v.startDrag(null, shadowBuilder, v, 0);
                    deleteAreaForAdapter.setVisibility(View.VISIBLE);
                    deleteAreaForAdapter.startAnimation(slide_in);
                    v.setVisibility(View.INVISIBLE);
                    return true;
                }
            });