如何在多个活动中使用拖放功能?

5

我使用 Service 调用创建浮动窗口,该窗口会浮在其他所有视图/活动之上。这个窗口有自己的 Activity,与对话框不同。

现在我想给这个窗口添加一个拖放(Drag&Drop)操作,例如,如果您长按浮动窗口中的一个 ImageView,则可以将其拖放到另一个 Activity(或基本 Activity)中。我一直在尝试使用 OnLongClickListener 触发拖动事件,并添加了 OnDragListener 来捕获放置事件。以下是我目前为止的代码:

public class MyFloatableActivity extends FloatActivity {
private ImageView mImg;

private MyDragEventListener mDragListen;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.float_activity));

    // This imageView is for Drag&Drop test
    mImg = (ImageView)findViewById(R.id.drag_img));
    mImg.setOnLongClickListener(new ImageView.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            ClipData dragData = ClipData.newPlainText("dragtext", "dragtext");

            v.startDrag(dragData, new View.DragShadowBuilder(v), null, 0);
            return false;
        }

    });

    mImg.setOnDragListener(mDragListen);

    switchToFloat(); // Make this activity to float
}

MyDragEventListener类是:

public class MyDragEventListener implements View.OnDragListener {

private ClipData mDragData;

@Override
public boolean onDrag(View v, DragEvent event) {
    final int action = event.getAction();
    ImageView img;

    if(v instanceof ImageView) {
        img = (ImageView)v;
    } else{
        return false;
    }

    switch(action) {
        case DragEvent.ACTION_DRAG_STARTED:
            if(event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
                Log.d("DDD", "Drag started!!!");
                return true;
            }else {
                return false;
            }
        case DragEvent.ACTION_DRAG_ENTERED:
            Log.d("DDD", "Entered!!!");
        case DragEvent.ACTION_DRAG_LOCATION:
        case DragEvent.ACTION_DRAG_EXITED:
            return true;
        case DragEvent.ACTION_DRAG_ENDED:
        case DragEvent.ACTION_DROP:
            Log.d("DDD", "Action drop!!!");
            return true;
    }
    return true;
}

我实现OnDragListener的原因是为了在基础活动中监听ACTION_DROP事件,当ImageView被放置时。这使我能够确定ImageView是放置在目标图像上还是布局上。以下是我的基础活动:

public class DragAndDropDemo extends Activity {

private ImageView mImg;

private MyDragEventListener mDragListen;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.drag_and_drop);

    //findViewById(R.id.drag_layout).setOnDragListener(mDragListen);

    mImg = (ImageView)findViewById(R.id.dest_img);

    mImg.setOnDragListener(mDragListen);
}

问题是在 DragAndDropDemo 中的 OnDragListener 没有被调用,因此我无法在我的基本 Activity 中捕获 Drop 事件。我看过很多拖放的例子,但从来没有得到正确的解决方案。我想知道在 Android 中是否可以将 Drag & Drop 事件抛给不同的 Activity。如果 Android 可以做到,那将是什么呢?
有人能帮忙吗?
1个回答

1

我已经自己找到了解决方案。我在MyFloatableActivity中整合了OnDragListener,然后向DragAndDropDemo活动发送意图以在发生放置事件时接收意图。

这是我的代码。

public class MyFloatableActivity extends FloatActivity {
...

@Override
protected void onCreate(Bundle savedInstanceState) {
...

    mImg.setOnDragListener(new View.OnDragListener() {

        @Override
        public boolean onDrag(View v, DragEvent event) {
            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_STARTED:
                    if (event.getClipDescription().hasMimeType(
                            ClipDescription.MIMETYPE_TEXT_PLAIN)) {
                        return true;
                    } else {
                        return false;
                    }
                case DragEvent.ACTION_DRAG_ENTERED:
                case DragEvent.ACTION_DRAG_LOCATION:
                case DragEvent.ACTION_DRAG_EXITED:
                    return true;
                case DragEvent.ACTION_DRAG_ENDED:
                case DragEvent.ACTION_DROP:
                    Intent intent = new Intent();
                    intent.setAction("com.test.DragAndDrop");
                    intent.putExtra("Drop", 0);
                    sendBroadcast(intent);
                    return true;

            }
            return false;
        }

    });
...
}

在 DragAndDropDemo 中,
public class DragAndDropDemo extends Activity {
...
@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction("com.test.DragAndDrop");
    registerReceiver(mBR, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mBR);
}

BroadcastReceiver mBR = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        int flag = intent.getIntExtra("Drop", 0);
        switch (flag) {
            case 0:
                mText.setText("dropped!");
                mImg.setImageResource(R.drawable.icon_argentina);
                break;
        }
    }

};
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接