4

我想从姜饼中将项目从一个网格视图拖到另一个网格视图。我正在调用 onTouchListener、onDragListener 但这些在 api 8 中不可用。我需要,它应该在 api 8 中工作。有人可以帮忙吗

4

1 回答 1

2

我有一个非常简单的解决方案.. 只需添加以下 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 是放置按钮/视图的线性布局。initialLayer 是您选择按钮/视图的 LinearLayout。

您可以将 LinearLayout 更改为网格布局。

不要忘记设置

initialLinear.setOnDragListener(new ChoiceDragListener(linear,initialLinearSecond));
dropTarget.setOnDragListener(new ChoiceDragListener(initialLinear,initialLinearSecond));
于 2013-04-09T11:08:37.043 回答