package com.pinecone.technology.mcommerce.android.learning.chapter11.dragdrop; import android.app.Activity; import android.content.ClipData; import android.graphics.Typeface; import android.os.Bundle; 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.widget.TextView; public class MainActivity extends Activity { // text views being dragged and dropped onto private TextView option1, option2, option3, choice1, choice2, choice3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_drag_drop); // get both sets of text views // views to drag option1 = (TextView) findViewById(R.id.option_1); option2 = (TextView) findViewById(R.id.option_2); option3 = (TextView) findViewById(R.id.option_3); // views to drop onto choice1 = (TextView) findViewById(R.id.choice_1); choice2 = (TextView) findViewById(R.id.choice_2); choice3 = (TextView) findViewById(R.id.choice_3); // set touch listeners option1.setOnTouchListener(new ChoiceTouchListener()); option2.setOnTouchListener(new ChoiceTouchListener()); option3.setOnTouchListener(new ChoiceTouchListener()); // set drag listeners choice1.setOnDragListener(new ChoiceDragListener()); choice2.setOnDragListener(new ChoiceDragListener()); choice3.setOnDragListener(new ChoiceDragListener()); } /** * ChoiceTouchListener will handle touch events on draggable views * */ private final class ChoiceTouchListener implements OnTouchListener { public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { /* * Drag details: we only need default behavior - clip data could * be set to pass data as part of drag - shadow can be tailored */ ClipData data = ClipData.newPlainText("", ""); DragShadowBuilder shadowBuilder = new View.DragShadowBuilder( view); // start dragging the item touched view.startDrag(data, shadowBuilder, view, 0); return true; } else { return false; } } } /** * DragListener will handle dragged views being dropped on the drop area - * only the drop action will have processing added to it as we are not - * amending the default behavior for other parts of the drag process * */ private class ChoiceDragListener implements OnDragListener { @Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: // no action necessary break; case DragEvent.ACTION_DRAG_ENTERED: // no action necessary break; case DragEvent.ACTION_DRAG_EXITED: // no action necessary break; case DragEvent.ACTION_DROP: // handle the dragged view being dropped over a drop view View view = (View) event.getLocalState(); // stop displaying the view where it was before it was dragged view.setVisibility(View.INVISIBLE); // view dragged item is being dropped on TextView dropTarget = (TextView) v; // view being dragged and dropped TextView dropped = (TextView) view; // update the text in the target view to reflect the data being // dropped dropTarget.setText(dropped.getText()); // make it bold to highlight the fact that an item has been // dropped dropTarget.setTypeface(Typeface.DEFAULT_BOLD); // if an item has already been dropped here, there will be a tag Object tag = dropTarget.getTag(); // if there is already an item here, set it back visible in its // original place if (tag != null) { // the tag is the view id already dropped here int existingID = (Integer) tag; // set the original view visible again findViewById(existingID).setVisibility(View.VISIBLE); } // set the tag in the target view being dropped on - to the ID // of the view being dropped dropTarget.setTag(dropped.getId()); break; case DragEvent.ACTION_DRAG_ENDED: // no action necessary break; default: break; } return true; } } }