¿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:
- Necesidad de la actividad del androide para esperar hasta que la localización GPS obtenida
- Establecer el color de la barra de progreso restante en android
- Cómo borrar todas las actividades anteriores ~?
- No se puede resolver la actividad para el resultado
- Cómo terminar varias actividades al salir del android
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?
- ¿Cómo evitar que se desinstale una aplicación?
- Inicio dinámico de la actividad con DexClassLoader
- "Estado persistente" vs. "estado actual"
- Cómo controlar el uso de memoria cuando se llama a varios WebView en Android?
- Error R.id.togglebutton1 y más
- ¿Dónde puedo encontrar las plantillas de Android Studio para la secuencia de comandos Activity and gradle?
- ¿Cómo forzar a Acivity principal a esperar a la subactividad en Android?
- ¿Puedo tener una actividad de Android ejecutada sólo la primera vez que se abra una aplicación?
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; } } }; }
- Obteniendo java.io.IOException: se ha producido un error en la lectura, el socket puede estar cerrado o el tiempo de espera en BluetoothSocket.connect ()
- Cómo conseguir lugares de Foursquare API