2013-05-13 4 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 वर्ग है:

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

कारण मैं कार्यान्वित OnDragListener आधार गतिविधि में 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); 
} 

समस्या DragAndDropDemo में OnDragListener लागू नहीं किया जा रहा है, इसलिए मैं अपने आधार गतिविधि में ड्रॉप घटना पकड़ नहीं सकता है। मैंने ड्रैग एंड ड्रॉप के कई उदाहरण देखे हैं, लेकिन सही समाधान के लिए कभी नहीं मिला। मैं सोच रहा हूं कि ड्रैग & एंड्रॉइड में अलग-अलग गतिविधि में ड्रॉप ईवेंट फेंकना संभव है। अगर एंड्रॉइड ऐसा कर सकता है, तो यह क्या होगा?

क्या कोई मदद कर सकता है?

उत्तर

1

मुझे अपने आप से समाधान मिला। मैंने OnDragListener को MyFloatableActivity में एकीकृत किया है, और जब भी ड्रॉप ईवेंट होता है तो इरादे प्राप्त करने के लिए 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; 
     } 
    } 

}; 
} 
संबंधित मुद्दे