2013-05-13 15 views
5

Serviceコールを使用して、他のすべてのビュー/アクティビティ上に浮動するフローティングウィンドウを作成しました。このウィンドウは独自のActivityを持ち、ダイアログとは異なります。複数のアクティビティでドラッグアンドドロップするにはどうすればよいですか?

今、私はあなたが長いフローティングウィンドウでImageViewをクリックした場合たとえば、あなたは別のActivity(またはベースの活動)にそれをドラッグアンドドロップすることができ、このウィンドウにドラッグ&ドロップアクションを追加します。ドラッグイベントを発生させるのにOnLongClickListenerを使用しようとしましたが、ドロップイベントを捕捉するためにOnDragListenerを追加しました。ここで私はこれまで持っているものです。

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 
} 

MyDragEventListenerクラスがある:私はOnDragListenerを実装

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

理由はImageViewがドロップされたときに、ベースの活動にACTION_DROPイベントを聞くことです。これにより、ImageViewがデスティネーションイメージまたはレイアウト上にドロップされたかどうかを判断することができます。ここに私の基本活動です:

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

問題が呼び出されていないので、私は私のベースのアクティビティにドロップイベントをキャッチすることができませんでしたDragAndDropDemoOnDragListenerです。私はドラッグアンドドロップの多くの例を見てきましたが、決して適切なソリューションには到達しませんでした。 Androidのさまざまなアクティビティにドラッグイベントをドロップすることが可能かどうか疑問に思っています。 Androidがそれを行うことができれば、それは何でしょうか?

誰かが助けることができますか?

答えて

1

自分で解決策を見つけました。私はにOnDragListenerを統合し、ドロップイベントが発生するたびにインテントを受信するためにインテントをDragAndDropDemoアクティビティに送信します。

ここに私のコードです。

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

    }); 
... 
} 

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

}; 
} 
関連する問題