2013-05-13 2 views
5

Ho utilizzato la chiamata Service per creare una finestra mobile che fluttua su tutte le altre viste/attività. Questa finestra ha il suo Activity ed è diversa da Dialog.Come posso trascinare e rilasciare con più attività?

ora voglio aggiungere un'azione Drag Drop & a questa finestra, ad esempio, se si fa clic su un lungo ImageView nella finestra mobile, è possibile trascinare e rilasciare in un altro Activity (o attività di base). Ho provato a utilizzare OnLongClickListener per attivare l'evento Trascina e ho aggiunto OnDragListener per catturare l'evento Drop. Ecco quello che ho finora:

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 
} 

classe MyDragEventListener è:

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

Il motivo ho implementato OnDragListener è quello di ascoltare ACTION_DROP evento a base di attività quando ImageView è caduto. Ciò mi consente di determinare se ImageView è stato rilasciato sull'immagine di destinazione o il layout. Ecco la mia attività di base:

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

Il problema è OnDragListener in DragAndDropDemo non viene richiamato, quindi non ho potuto prendere l'evento Drop in mia base di attività. Ho visto molti esempi di Drag and Drop, ma non ho mai trovato la soluzione giusta. Mi chiedo se è possibile lanciare un evento Trascinare & su diverse attività in Android. Se Android potesse farlo, quale sarebbe?

C'è qualcuno può aiutare?

risposta

1

Ho trovato la soluzione da solo. Ho integrato in MyFloatableActivity e inviato l'intento all'attività DragAndDropDemo per ricevere intenti ogni volta che si verifica un evento di rilascio.

Quindi ecco il mio codice.

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

    }); 
... 
} 

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

}; 
}