কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডে ড্র্যাগ অ্যান্ড ড্রপ ইমপ্লিমেন্টেশন

View.OnDragListener এবং View.OnTouchListener ব্যবহার করে ড্র্যাগ অ্যান্ড ড্রপ

এই উদাহরণটি দেখায় কীভাবে একটি ImageView-কে একটি LinearLayout- থেকে অন্য LinearLayout-এ ড্র্যাগ করে ড্রপ করা যায়।

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন

Android Studio-তে File → New Project থেকে প্রজেক্ট তৈরি করুন।

ধাপ ২: লেআউট XML (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="16dp"
    tools:context="MainActivity">
    
    <!-- বাম প্যানেল (সোর্স) -->
    <LinearLayout
        android:id="@+id/leftView"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_margin="10dp"
        android:background="@android:color/darker_gray"
        android:gravity="center"
        android:orientation="vertical">
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Drag from here"
            android:textColor="@android:color/white"
            android:textStyle="bold"
            android:layout_marginBottom="16dp"/>
        
        <ImageView
            android:id="@+id/boxView"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center"
            android:layout_margin="10dp"
            android:background="@android:color/holo_blue_dark"
            android:contentDescription="Draggable box" />
    </LinearLayout>
    
    <!-- ডান প্যানেল (টার্গেট) -->
    <LinearLayout
        android:id="@+id/rightView"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_margin="10dp"
        android:background="@android:color/darker_gray"
        android:gravity="center"
        android:orientation="vertical">
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Drop here"
            android:textColor="@android:color/white"
            android:textStyle="bold"
            android:layout_marginBottom="16dp"/>
    </LinearLayout>
</LinearLayout>

ধাপ ৩: MainActivity.java বাস্তবায়ন

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnTouchListener, View.OnDragListener {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // ড্র্যাগেবল ভিউতে টাচ লিসেনার
        findViewById(R.id.boxView).setOnTouchListener(this);
        
        // ড্রপ টার্গেট লেআউটগুলোতে ড্র্যাগ লিসেনার
        findViewById(R.id.leftView).setOnDragListener(this);
        findViewById(R.id.rightView).setOnDragListener(this);
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            // ড্র্যাগ শুরু করুন
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            // ClipData খালি রাখুন (ডেটা ট্রান্সফার না হলে)
            view.startDragAndDrop(null, shadowBuilder, view, 0);
            view.setVisibility(View.INVISIBLE); // ড্র্যাগ সময় অদৃশ্য করুন
            return true;
        }
        return false;
    }

    @Override
    public boolean onDrag(View view, DragEvent event) {
        int action = event.getAction();
        
        switch (action) {
            case DragEvent.ACTION_DRAG_STARTED:
                // ড্র্যাগ শুরু হয়েছে, ভিউটি হাইলাইট করুন (ঐচ্ছিক)
                view.setBackgroundColor(0xFFE0E0E0);
                return true;
                
            case DragEvent.ACTION_DRAG_ENTERED:
                // ড্র্যাগইঙ্গ আইটেম এই ভিউয়ের মধ্যে ঢুকেছে
                view.setBackgroundColor(0xFFB0E0B0); // হালকা সবুজ
                return true;
                
            case DragEvent.ACTION_DRAG_EXITED:
                // ড্র্যাগইঙ্গ আইটেম এই ভিউয়ের বাইরে পেল
                view.setBackgroundColor(0xFFE0E0E0);
                return true;
                
            case DragEvent.ACTION_DROP:
                // ড্রপ হয়েছে - ভিউটি নতুন প্যারেন্টে সরান
                View draggedView = (View) event.getLocalState();
                ViewGroup sourceParent = (ViewGroup) draggedView.getParent();
                ViewGroup targetParent = (ViewGroup) view;
                
                // সোর্স থেকে রিমুভ করুন
                if (sourceParent != null) {
                    sourceParent.removeView(draggedView);
                }
                
                // টার্গেটে অ্যাড করুন
                targetParent.addView(draggedView);
                draggedView.setVisibility(View.VISIBLE);
                
                Toast.makeText(this, "Dropped in " + getResources().getResourceEntryName(view.getId()), Toast.LENGTH_SHORT).show();
                return true;
                
            case DragEvent.ACTION_DRAG_ENDED:
                // ড্র্যাগ সমাপ্ত
                view.setBackgroundColor(0xFF757575); // মূল রঙে ফিরান
                // ড্রপ না হলে ভিউটি ফিরিয়ে আনুন
                if (!event.getResult()) {
                    View draggedView = (View) event.getLocalState();
                    draggedView.setVisibility(View.VISIBLE);
                }
                return true;
        }
        return false;
    }
}

ড্র্যাগ অ্যান্ড ড্রপ ফ্লো ব্যাখ্যা

  1. ACTION_DOWN: টাচ শুরু → startDragAndDrop() কল করুন
  2. DragShadowBuilder: ড্র্যাগ সময় দেখানোর ছায়া তৈরি করে
  3. ACTION_DRAG_STARTED: ড্রপ টার্গেট এই ইভেন্ট পায়, true রিটার্ন করলে ড্রপ গ্রহণ করবে
  4. ACTION_DRAG_ENTERED/EXITED: ভিউয়ের মধ্যে/বাইরে যাওয়ার সময় ভিজ্যুয়াল ফিডব্যাক
  5. ACTION_DROP: ড্রপ হয়েছে, ডেটা ট্রান্সফার এবং ভিউ রিলোকেশন করুন
  6. ACTION_DRAG_ENDED: ড্র্যাগ সেশন শেষ, ক্লিনআপ করুন

উন্নত ফিচার: ডেটা ট্রান্সফার (ClipData)

// ড্র্যাগ শুরু করার সময় ডেটা পাস করুন
ClipData data = ClipData.newPlainText("item_id", "boxView");
view.startDragAndDrop(data, shadowBuilder, view, 0);

// ড্রপের সময় ডেটা পান
ClipData.Item item = event.getClipData().getItemAt(0);
String itemId = item.getText().toString();

আধুনিক API (API 24+): startDragAndDrop()

পুরনো startDrag() ডিপ্রিকেটেড। নতুন মেথড ব্যবহার করুন:

// API 24+
view.startDragAndDrop(clipData, shadowBuilder, localState, flags);

// ফ্ল্যাগ অপশন:
// View.DRAG_FLAG_GLOBAL - অন্য অ্যাপে ড্র্যাগ করার অনুমতি
// View.DRAG_FLAG_GLOBAL_URI_READ - URI রিড পারমিশন
// View.DRAG_FLAG_GLOBAL_URI_WRITE - URI রাইট পারমিশন

RecyclerView-এ ড্র্যাগ অ্যান্ড ড্রপ (ItemTouchHelper)

লিস্টে আইটেম রি-অর্ডার করার জন্য ItemTouchHelper ব্যবহার করুন:

ItemTouchHelper.Callback callback = new ItemTouchHelper.Callback() {
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        return makeMovementFlags(dragFlags, 0);
    }
    
    @Override
    public boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHolder target) {
        // 어댑্টারে পজিশন সওয়াপ করুন
        adapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }
    
    @Override
    public void onSwiped(ViewHolder viewHolder, int direction) {}
};

ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(recyclerView);

ধাপ ৪: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

অ্যাপ্লিকেশন টেস্ট করুন

অ্যাপ রান করুন। নীল বক্সটি লং প্রেস করে ড্র্যাগ করুন এবং ডান প্যানেলে ড্রপ করুন। বক্সটি ডান প্যানেলে চলে যাবে। আবার ড্র্যাগ করে বামে আনা যাবে।

  1. অ্যান্ড্রয়েডে মাউস এবং কীবোর্ড ব্যবহার করার পদ্ধতি

  2. অ্যান্ড্রয়েড টিভিতে ADB সেট আপ এবং ব্যবহার করার পদ্ধতি

  3. iOS 11-এ ড্র্যাগ অ্যান্ড ড্রপ ব্যবহার করার উপায়

  4. Android Visibility Listeners মাস্টার করুন: ভিউ দৃশ্যমানতা ট্র্যাক করার পদ্ধতি ও কারণ