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?

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; } } }; } 
  • Implementieren Wischen in ListView
  • Wie beschränke ich den Drag & Drop entlang der y-Achse nur in Android?
  • Jquery Drag Drop hängt oder wird für Android Browser stecken
  • Stoppen Sie OnLongClickListener beim Brennen beim Ziehen
  • Android - Drag & Drop - Liste neu anordnen
  • Pflegen Sie Drag & Dropped Items Position beim Neustart
  • Beste Weg, um Elemente in Android 4+ ListView neu zu ordnen
  • Fehlende ImageView-Quellen das erste Mal, dass ich Drag & Drop in meinem GridView
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.