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;
}
}
ড্র্যাগ অ্যান্ড ড্রপ ফ্লো ব্যাখ্যা
- ACTION_DOWN: টাচ শুরু →
startDragAndDrop()কল করুন - DragShadowBuilder: ড্র্যাগ সময় দেখানোর ছায়া তৈরি করে
- ACTION_DRAG_STARTED: ড্রপ টার্গেট এই ইভেন্ট পায়, true রিটার্ন করলে ড্রপ গ্রহণ করবে
- ACTION_DRAG_ENTERED/EXITED: ভিউয়ের মধ্যে/বাইরে যাওয়ার সময় ভিজ্যুয়াল ফিডব্যাক
- ACTION_DROP: ড্রপ হয়েছে, ডেটা ট্রান্সফার এবং ভিউ রিলোকেশন করুন
- 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>
অ্যাপ্লিকেশন টেস্ট করুন
অ্যাপ রান করুন। নীল বক্সটি লং প্রেস করে ড্র্যাগ করুন এবং ডান প্যানেলে ড্রপ করুন। বক্সটি ডান প্যানেলে চলে যাবে। আবার ড্র্যাগ করে বামে আনা যাবে।