Я пытаюсь ввести следующий код в свое основное действие, чтобы иметь возможность перетаскивать изображение, но получаю ошибки, потому что он объявляет основное действие во второй раз. Если я запускаю код в программе сам по себе, он работает нормально. Когда я вставляю его в свою существующую программу, я получаю сообщение об ошибке. Как я могу изменить этот код, чтобы мое изображение можно было выбирать и перетаскивать, и мне не приходилось снова ссылаться на основное действие? Я использую Android Studio.
public class MainActivity extends AppCompatActivity implements View.OnDragListener, View.OnLongClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Find all views and set Tag to all draggable views
ImageView imgVw = findViewById(R.id.ingvw);
imgVw.setTag("ANDROID ICON");
imgVw.setOnLongClickListener(this);
findViewById(R.id.layout1).setOnDragListener(this);
}
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence) v.getTag());
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData data = new ClipData(v.getTag().toString(), mimeTypes, item);
View.DragShadowBuilder dragshadow = new View.DragShadowBuilder(v);
v.startDrag(data // data to be dragged
, dragshadow // drag shadow builder
, v // local data about the drag and drop operation
, 0 // flags (not currently used, set to 0)
);
return true;
}
// This is the method that the system calls when it dispatches a drag event to the listener.
@Override
public boolean onDrag(View v, DragEvent event) {
// Defines a variable to store the action type for the incoming event
int action = event.getAction();
// Handles each of the expected events
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
// Determines if this View can accept the dragged data
if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
return true;
}
// Returns false. During the current drag and drop operation, this View will
// not receive events again until ACTION_DRAG_ENDED is sent.
return false;
case DragEvent.ACTION_DRAG_ENTERED:
// Applies a GRAY or any color tint to the View. Return true; the return value is ignored.
v.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN);
// Invalidate the view to force a redraw in the new tint
v.invalidate();
return true;
case DragEvent.ACTION_DRAG_LOCATION:
// Ignore the event
return true;
case DragEvent.ACTION_DRAG_EXITED:
// Re-sets the color tint to blue. Returns true; the return value is ignored.
// view.getBackground().setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
//It will clear a color filter .
v.getBackground().clearColorFilter();
// Invalidate the view to force a redraw in the new tint
v.invalidate();
return true;
case DragEvent.ACTION_DROP:
// Gets the item containing the dragged data
ClipData.Item item = event.getClipData().getItemAt(0);
// Gets the text data from the item.
String dragData = item.getText().toString();
// Displays a message containing the dragged data.
//Toast.makeText(this, "Dragged data is " + dragData, Toast.LENGTH_SHORT).show();
// Turns off any color tints
v.getBackground().clearColorFilter();
// Invalidates the view to force a redraw
v.invalidate();
View vw = (View) event.getLocalState();
ViewGroup owner = (ViewGroup) vw.getParent();
owner.removeView(vw); //remove the dragged view
//caste the view into LinearLayout as our drag acceptable layout is LinearLayout
LinearLayout container = (LinearLayout) v;
container.addView(vw);//Add the dragged view
vw.setVisibility(View.VISIBLE);//finally set Visibility to VISIBLE
// Returns true. DragEvent.getResult() will return true.
return true;
case DragEvent.ACTION_DRAG_ENDED:
// Turns off any color tinting
v.getBackground().clearColorFilter();
// Invalidates the view to force a redraw
v.invalidate();
// Does a getResult(), and displays what happened.
//if (event.getResult())
// Toast.makeText(this, "The drop was handled.", Toast.LENGTH_SHORT).show();
//else
//Toast.makeText(this, "The drop didn't work.", Toast.LENGTH_SHORT).show();
// returns true; the value is ignored.
//return true;
// An unknown action type was received.
default:
Log.e("DragDrop Example", "Unknown action type received by OnDragListener.");
break;
}
return false;
}
}