Мне нужно поменять imageButtons между 2 линейными раскладками, используя drag & drop.
Сначала я выбираю изображение с помощью длинного щелчка:
public boolean onLongClick(View v) {ClipData data =
ClipData.newPlainText("value", (CharSequence) v.getTag());
v.startDrag(data, new DragShadowBuilder(v), null, 0);
if (v == iButtonId1) {tempField.setTag("iButtonId1");}
return true;
}
также тег, назначенный для tempField, чтобы использовать его для удаления того же изображения.
затем я помещаю этот imageButton (id = iButtonId1) в линейный макет (frame3), где iButtonId2 уже размещен:
class frame3DragListener implements View.OnDragListener {
@Override
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
return true;
case DragEvent.ACTION_DRAG_ENTERED:
v.setBackgroundColor(Color.LTGRAY);
return true;
case DragEvent.ACTION_DRAG_LOCATION:
return true;
case DragEvent.ACTION_DRAG_EXITED:
v.setBackgroundResource(R.mipmap.frame3);
return true;
case DragEvent.ACTION_DROP:
if (tempField.getTag() == "iButtonId1") {
ViewGroup owner = (ViewGroup)
iButtonId1.getParent();
owner.removeView(iButtonId1);
LinearLayout container = (LinearLayout) v;
container.removeView(iButtonId2);
owner.addView(iButtonId2);
container.addView(iButtonId1);
}}}}
return true;
case DragEvent.ACTION_DRAG_ENDED:
return true;
default:
break;
}
return false;
}
}
и работает нормально.
Но, как вы можете видеть, эти кнопки изображения жестко закодированы в ACTION_DROP.
Это означает, что если существует много кнопок и макетов для изображений, куда их можно поместить, этот жесткий код превратится в кошмар.
Так, как я могу заменить эти жестко закодированные значения и дать системе знать, какое изображение будет отброшено
а какое imageButton уже размещено в той же линейной раскладке?
P.S. если iButtonId1.getParent () заменен на view.getParent (), то Android не может найти родителя для нулевого объекта.