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

Android-এ একটি ফ্র্যাগমেন্ট থেকে অন্য ফ্র্যাগমেন্টে ডেটা পাস করার পদ্ধতি

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 আইকনে ক্লিক করুন এবং ডিভাইসে আউটপুট দেখুন। প্রথম ট্যাবে টেক্সট লিখে বাটনে ক্লিক করলে দ্বিতীয় ট্যাবে তা প্রদর্শিত হবে।

Android-এ একটি ফ্র্যাগমেন্ট থেকে অন্য ফ্র্যাগমেন্টে ডেটা পাস করার পদ্ধতি

  1. অ্যান্ড্রয়েডে একটি এক্টিভিটি থেকে অন্য এক্টিভিটিতে স্ট্রিং পাস করার পদ্ধতি

  2. অ্যান্ড্রয়েডে একটি অবজেক্ট এক এক্টিভিটি থেকে অন্য একে পাস করার পদ্ধতি

  3. অ্যান্ড্রয়েডে ইন্টেন্ট ব্যবহার করে একটি এক্টিভিটির থেকে অন্য এক্টিভিটিতে অবজেক্ট পাঠানোর পদ্ধতি

  4. অ্যান্ড্রয়েডে একটি ইমেজ এক्टीভিটি থেকে অন্য এক्टीভিটিতে পাস করার পদ্ধতি