我需要使用拖放功能在2个线性布局之间交换imageButtons。
首先,我通过长按选择一个imageButton:
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。
然后将那个imageButton(id = iButtonId1)放到已经放置iButtonId2的线性布局(frame3)中:
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;
}
}
它工作正常。
但是正如您所看到的,这些imageButton在ACTION_DROP中进行了硬编码。 这意味着,如果有很多可以放在其中的imageButtons和布局,那么硬编码将变成噩梦。
那么我该如何替换那些硬编码的值并使系统知道要删除的imageButton 以及什么imageButton已经放置在相同的线性布局中?
P.S。如果将iButtonId1.getParent()替换为view.getParent(),则Android无法找到空对象的父级。