Android-এ একটি ফ্র্যাগমেন্ট থেকে অন্য ফ্র্যাগমেন্টে ডেটা পাস করার পদ্ধতি
এই উদাহরণটি দেখায় কিভাবে ViewPager এবং TabLayout ব্যবহার করে দুটি ফ্র্যাগমেন্টের মধ্যে ডেটা আদান-প্রদান করা যায়। আমরা একটি ইন্টারফেস ব্যবহার করে ফ্র্যাগমেন্ট থেকে এক্টিভিটিতে ডেটা পাঠাব এবং এক্টিভিটি সেটি দ্বিতীয় ফ্র্যাগমেন্টে ফরওয়ার্ড করবে।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project এ যান এবং "ViewPager2" বা "Tabbed Activity" টেমপ্লেট বেছে নিন, অথবা খালি প্রজেক্ট তৈরি করুন।
ধাপ ২: মেইন লেআউট (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"
app:tabMode="fixed" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
দ্রষ্টব্য: আধুনিক Android-এ ViewPager2 ব্যবহার করা উচিত যা RecyclerView-র ওপর ভিত্তি করে তৈরি এবং আরও কার্যকর।
ধাপ ৩: প্রথম ফ্র্যাগমেন্ট তৈরি করুন
FragmentOne.java
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
public class FragmentOne extends Fragment {
private SendMessage sendMessage;
public FragmentOne() {
// প্রয়োজনীয় খালি কনস্ট্রাক্টর
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_fragment_one, container, false);
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button btnPassData = view.findViewById(R.id.btnPassData);
final EditText inData = view.findViewById(R.id.passMessage);
btnPassData.setOnClickListener(v -> {
String message = inData.getText().toString().trim();
if (!message.isEmpty() && sendMessage != null) {
sendMessage.sendData(message);
}
});
}
// ইন্টারফেস যা এক্টিভিটি ইমপ্লিমেন্ট করবে
interface SendMessage {
void sendData(String message);
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
sendMessage = (SendMessage) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException("এক্টিভিটি SendMessage ইমপ্লিমেন্ট করতে হবে");
}
}
@Override
public void onDetach() {
super.onDetach();
sendMessage = null; // মেমরি লিক এড়াতে
}
}
fragment_fragment_one.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/passMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/btnPassData"
android:layout_margin="16dp"
android:hint="এখানে লিখুন" />
<Button
android:id="@+id/btnPassData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="দ্বিতীয় ফ্র্যাগমেন্টে ডেটা পাঠান" />
</RelativeLayout>
</ScrollView>
ধাপ ৪: দ্বিতীয় ফ্র্যাগমেন্ট তৈরি করুন
FragmentTwo.java
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class FragmentTwo extends Fragment {
private TextView textView;
public FragmentTwo() {
// প্রয়োজনীয় খালি কনস্ট্রাক্টর
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_fragment_two, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
textView = view.findViewById(R.id.txtData);
}
// এক্টIVITY থেকে ডেটা পেতে এই মেথড কল করবে
public void displayReceivedData(String message) {
textView.setText("প্রাপ্ত ডেটা: " + message);
}
}
fragment_fragment_two.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".FragmentTwo">
<TextView
android:id="@+id/txtData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="কোনো ডেটা প্রাপ্ত হয়নি"
android:textSize="20sp"
android:textStyle="bold" />
</RelativeLayout>
ধাপ ৫: ViewPager অ্যাডাপ্টার তৈরি করুন
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
public class ViewPagerAdapter extends FragmentStateAdapter {
public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new FragmentOne();
case 1:
return new FragmentTwo();
default:
return new FragmentOne();
}
}
@Override
public int getItemCount() {
return 2; // মোট ফ্র্যাগমেন্ট সংখ্যা
}
}
ধাপ ৬: MainActivity.java বাস্তবায়ন করুন
package app.com.sample;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;
import android.os.Bundle;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
public class MainActivity extends AppCompatActivity implements FragmentOne.SendMessage {
TabLayout tabLayout;
ViewPager2 viewPager;
ViewPagerAdapter viewPagerAdapter;
FragmentTwo fragmentTwo; // রেফারেন্স রাখা
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewPager);
viewPagerAdapter = new ViewPagerAdapter(this);
viewPager.setAdapter(viewPagerAdapter);
tabLayout = findViewById(R.id.tabLayout);
// TabLayoutMediator ব্যবহার করে ট্যাব এবং ViewPager2 লিঙ্ক করুন
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
switch (position) {
case 0:
tab.setText("প্রথম");
break;
case 1:
tab.setText("দ্বিতীয়");
break;
}
}).attach();
// FragmentTwo-এর রেফারেন্স পেতে
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
if (position == 1) {
fragmentTwo = (FragmentTwo) getSupportFragmentManager()
.findFragmentByTag("f" + viewPager.getId() + ":" + position);
}
}
});
}
@Override
public void sendData(String message) {
// FragmentTwo-এ ডেটা পাঠান
if (fragmentTwo != null) {
fragmentTwo.displayReceivedData(message);
} else {
// যদি ফ্র্যাগমেন্ট এখনো তৈরি না হয়, তবে আর্গুমেন্ট হিসেবে পাস করুন
Bundle bundle = new Bundle();
bundle.putString("message", message);
FragmentTwo f2 = new FragmentTwo();
f2.setArguments(bundle);
// ViewPager অ্যাডাপ্টারের মাধ্যমে আপডেট করুন
}
}
}
বিকল্প পদ্ধতি: Shared ViewModel (আধুনিক এবং পরামর্শিত)
আধুনিক Android ডেভেলপমেন্টে ফ্র্যাগমেন্ট間 ডেটা শেয়ার করার জন্য Shared ViewModel ব্যবহার করা সেরা পদ্ধতি:
// SharedViewModel.java
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class SharedViewModel extends ViewModel {
private final MutableLiveData<String> message = new MutableLiveData<>();
public void setMessage(String msg) {
message.setValue(msg);
}
public LiveData<String> getMessage() {
return message;
}
}
// FragmentOne-এ
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.setMessage("হ্যালো ফ্র্যাগমেন্ট টু!");
// FragmentTwo-এ
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getMessage().observe(getViewLifecycleOwner(), msg -> {
textView.setText("প্রাপ্ত ডেটা: " + msg);
});
ধাপ ৭: 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>
অ্যাপ্লিকেশন চালানোর পদ্ধতি
আপনার Android ডিভাইস কম্পিউটারের সাথে সংযুক্ত করুন। Android Studio-তে Run আইকনে ক্লিক করুন এবং ডিভাইসে আউটপুট দেখুন। প্রথম ট্যাবে টেক্সট লিখে বাটনে ক্লিক করলে দ্বিতীয় ট্যাবে তা প্রদর্শিত হবে।
