我想从姜饼中将项目从一个gridview拖到另一个gridview。我正在调用onTouchListener,onDragListener,但这些在api 8中不可用。我需要,它应该在api 8中工作。任何人都可以帮助
答案 0 :(得分:2)
我有一个非常简单的解决方案.. 只需添加以下两个功能。
ChoiceTouchListner()
/**
* ChoiceTouchListener will handle touch events on draggable views
*
*/
@SuppressLint({ "NewApi", "NewApi" })
private final class ChoiceTouchListener implements OnTouchListener {
@SuppressLint("NewApi")
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;
}
}
}
ChoiceDragListener()
/**
* 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 {
private LinearLayout initiallinear;
public ChoiceDragListener(LinearLayout initialLinear ) {
this.initiallinear = initialLinear;
}
@SuppressLint({ "NewApi", "NewApi", "NewApi" })
@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
LinearLayout dropTarget = (LinearLayout) v;
// view being dragged and dropped
Button dropped = (Button) view;
// update the text in the target view to reflect the data being
// dropped
int recentTag = (Integer) dropped.getTag();
if (dropped.getParent() == dropTarget) {
dropTarget.removeView(dropped);
dropTarget.invalidate();
} else {
initiallinear.removeView(dropped);
initiallinear.invalidate();
}
try {
dropTarget.addView(dropped);
dropTarget.invalidate();
} catch (Exception e) {
System.out.println(e);
}
dropped.setVisibility(View.VISIBLE);
dropTarget.invalidate();
// 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;
}
}
您的整个代码将在DragEvent.ACTION_DROP中完成。 这里dropTarget是您放置按钮/视图的Linearlayout。 initialLayer是您选择按钮/视图的LinearLayout。
您可以将LinearLayout更改为网格布局。
别忘了设置
initialLinear.setOnDragListener(new ChoiceDragListener(linear,initialLinearSecond));
dropTarget.setOnDragListener(new ChoiceDragListener(initialLinear,initialLinearSecond));