2013-05-13 20 views
5

Tôi đã sử dụng cuộc gọi Service để tạo Cửa sổ nổi nổi trên tất cả các chế độ xem/hoạt động khác. Cửa sổ này có Activity và khác với Hộp thoại.Tôi có thể kéo và thả bằng nhiều hoạt động như thế nào?

Bây giờ tôi muốn thêm hành động thả & Thả vào cửa sổ này, ví dụ nếu bạn bấm dài ImageView trong Cửa sổ Nổi, bạn có thể Kéo và Thả nó vào một Activity (hoặc Hoạt động cơ sở) khác. Tôi đã cố gắng sử dụng OnLongClickListener để kích hoạt sự kiện Kéo và thêm OnDragListener để bắt sự kiện thả. Dưới đây là những gì tôi có cho đến nay:

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 
} 

lớp MyDragEventListener là:

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; 
} 

Lý do tôi thực hiện OnDragListener là lắng nghe ACTION_DROP sự kiện trong Hoạt động cơ sở khi ImageView được giảm. Điều này cho phép tôi xác định xem ImageView đã bị xóa trên hình ảnh đích hay bố cục. Dưới đây là Hoạt động cơ sở của tôi:

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); 
} 

Vấn đề là OnDragListener trong DragAndDropDemo không được gọi, vì vậy tôi không thể nắm bắt những sự kiện Drop trong Hoạt động cơ sở của tôi. Tôi đã thấy nhiều ví dụ về Kéo và Thả, nhưng chưa bao giờ có giải pháp đúng. Tôi tự hỏi nếu ném một sự kiện thả & thả vào hoạt động khác nhau trong Android là có thể. Nếu Android có thể làm điều đó, nó sẽ là gì?

Có ai có thể giúp bạn không?

Trả lời

1

Tôi đã tự tìm ra giải pháp. Tôi đã tích hợp OnDragListener vào MyFloatableActivity và gửi ý định tới DragAndDropDemo hoạt động để nhận ý định bất cứ khi nào xảy ra sự kiện thả.

Vì vậy, đây là mã của tôi.

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; 
     } 

    }); 
... 
} 

và trong 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; 
     } 
    } 

}; 
} 
Các vấn đề liên quan