¿Cómo puedo arrastrar y soltar con múltiples actividades?

Utilicé la llamada de Service para crear una ventana flotante que flota sobre todas las demás vistas / actividades. Esta ventana tiene su propia Activity y es diferente de Dialog.

Ahora quiero añadir una acción de arrastrar y soltar a esta ventana, por ejemplo, si hace clic en un ImageView en la ventana flotante, puede arrastrarla y colocarla en otra Activity (o actividad base). Me han intentado utilizar OnLongClickListener para accionar el evento de la fricción, y agregado OnDragListener para coger el acontecimiento de la gota. Esto es lo que tengo hasta ahora:

 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 } 

La clase MyDragEventListener es:

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

La razón por la que implementé OnDragListener es escuchar el evento ACTION_DROP en la actividad base cuando se ACTION_DROP ImageView . Esto me permite determinar si el ImageView se eliminó en la imagen de destino o en el diseño. Aquí está mi base Actividad:

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

El problema es OnDragListener en DragAndDropDemo no se está invocando, por lo que no podía coger el evento Drop en mi actividad base. He visto muchos ejemplos de Drag and Drop, pero nunca llegó a la solución correcta. Me pregunto si lanzar un evento de arrastrar y soltar a diferentes actividades en Android es posible. Si Android pudiera hacerlo, ¿cuál sería?

¿Hay alguien puede ayudar?

Encontré la solución por mí mismo. OnDragListener en MyFloatableActivity , y envío intención a la actividad de DragAndDropDemo para recibir intents cada vez que ocurre un evento de la gota.

Así que aquí está mi código.

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

Y en 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; } } }; } 
  • Enviar datos de la actividad al servicio en ejecución
  • Debería tener referencias a fragmentos dentro de mi actividad
  • Cambiar programaticamente el color de la forma en la lista de capas
  • Reanudar la actividad en Android
  • Valor predeterminado para resultCode cuando la actividad termina
  • Después de validar el número de teléfono de Digits por twitter, recibo dos instancias de mi aplicación en actividad reciente
  • Lanzar Skype desde una aplicación mediante programación y número de pase - Android
  • Datos de paso de Android entre Fragmentos
  • Actividad que se desliza de abajo a arriba pero la actividad de fondo no debe moverse
  • ¿Cómo exportar una actividad para que otras aplicaciones puedan llamarla?
  • OnActivityResult siempre devuelve 0 (RESULT_CANCELED) al llamar a la configuración
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.