Wie kann ich per Drag & Drop mit mehreren Aktivitäten?

Ich habe den Service Aufruf verwendet, um ein Floating-Fenster zu erstellen, das über alle anderen Ansichten / Aktivitäten schwimmt. Dieses Fenster hat seine eigene Activity und unterscheidet sich von Dialog.

Nun möchte ich eine Drag & Drop-Aktion zu diesem Fenster hinzufügen, zum Beispiel wenn du lange auf eine ImageView im Floating-Fenster ImageView , kannst du es in eine andere Activity (oder Basis-Aktivität) ziehen und verschieben. Ich habe versucht, OnLongClickListener zu verwenden, um Drag-Ereignis auszulösen, und fügte OnDragListener hinzu, um das Drop-Ereignis zu fangen. Hier ist was ich bisher habe

 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 } 

Die MyDragEventListener-Klasse ist:

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

Der Grund, warum ich OnDragListener implementiert OnDragListener besteht darin, das ACTION_DROP Ereignis in der Basis-Aktivität zu hören, wenn ImageView gelöscht wird. So kann ich feststellen, ob das ImageView auf das Zielbild oder das Layout gelöscht wurde. Hier ist meine Basis Tätigkeit:

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

Das Problem ist, dass OnDragListener in DragAndDropDemo nicht aufgerufen wird, also konnte ich das Drop-Ereignis in meiner Basis-Aktivität nicht fangen. Ich habe viele Beispiele von Drag and Drop gesehen, aber niemals die richtige Lösung. Ich frage mich, ob das Werfen eines Drag & Drop-Events auf verschiedene Aktivitäten in Android möglich ist. Wenn Android es tun könnte, was wäre das?

Gibt es jemand kann helfen?

  • Android / Kindle Drag Drop Gefroren gelegentlich
  • Drag & Drop-Symbole auf den Startbildschirm
  • Java.util.ConcurrentModificationException in View.setVisibility
  • Größe der Drop-Zone für Blase zerstören
  • Android: Drag and Drop Problem
  • Wie ziehe ich das Listview-Element in eine andere Listview
  • Warum tauschen die Listenelemente nicht aus?
  • Scroll gridview beim Ziehen von Element (als Schatten)
  • One Solution collect form web for “Wie kann ich per Drag & Drop mit mehreren Aktivitäten?”

    Ich habe die Lösung von mir selbst gefunden. Ich integrierte OnDragListener in MyFloatableActivity und schicke Absicht zur DragAndDropDemo Aktivität, um Intentionen zu erhalten, wenn ein Drop-Event auftritt.

    Also hier ist mein Code.

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

    Und in 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; } } }; } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.