我一直在尝试在Android中实现一个非常简单的拖放操作,其中拖动的项目与放置它的项目交换位置.
我已经成功实现了onLongClick和onDrag监听器.当我拖放一个项目时,它会替换掉它所放置的项目,但我无法弄清楚如何使被替换的项目取代被拖动的项目.
我花了一些时间寻找答案,但大多数答案只是链接复杂的拖放操作,涉及许多带有大量代码的文件,而我无法理解它们将它们应用到我的代码中.
我最初假设我没有得到ImageView的真实副本
ImageView temp = (ImageView) event.getLocalState();
Run Code Online (Sandbox Code Playgroud)
所以我试过了
ImageView dragged = (ImageView) findViewById(temp.getId());
Run Code Online (Sandbox Code Playgroud)
但这并没有什么不同.
我几乎可以肯定问题出现在'OnDragListener'中,在'case DragEvent.ACTION_DROP:'中.这是我的代码(来自Main.java):
public class Main extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.ball1).setOnLongClickListener(listenClick);
findViewById(R.id.ball1).setOnDragListener(listenDrag);
findViewById(R.id.target1).setOnLongClickListener(listenClick);
findViewById(R.id.target1).setOnDragListener(listenDrag);
findViewById(R.id.target2).setOnDragListener(listenDrag);
findViewById(R.id.target2).setOnLongClickListener(listenClick);
findViewById(R.id.target3).setOnDragListener(listenDrag);
findViewById(R.id.target3).setOnLongClickListener(listenClick);
View.OnLongClickListener listenClick = new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
ClipData data = ClipData.newPlainText("","");
DragShadow dragShadow = new DragShadow(v);
v.startDrag(data, dragShadow, v, 0);
return false;
}
};
private class DragShadow extends View.DragShadowBuilder
{
ColorDrawable greyBox;
public DragShadow(View view) …Run Code Online (Sandbox Code Playgroud)