টুকরো লেনদেন

রানটাইমে, একজন FragmentManager ব্যবহারকারীর ইন্টারঅ্যাকশনের প্রতিক্রিয়া হিসাবে টুকরোগুলির সাথে যুক্ত, অপসারণ, প্রতিস্থাপন এবং অন্যান্য ক্রিয়া সম্পাদন করতে পারে। FragmentTransaction ক্লাস দ্বারা প্রদত্ত API ব্যবহার করে আপনি লেনদেনের ভিতরে কী করবেন তা নির্দিষ্ট করতে পারেন। আপনি একাধিক ক্রিয়াকে একটি একক লেনদেনে গোষ্ঠীবদ্ধ করতে পারেন—উদাহরণস্বরূপ, একটি লেনদেন একাধিক খণ্ড যুক্ত বা প্রতিস্থাপন করতে পারে। এই গোষ্ঠীকরণটি উপযোগী হতে পারে যখন আপনার একই স্ক্রিনে একাধিক ভাইবোন টুকরা প্রদর্শিত হয়, যেমন বিভক্ত দৃশ্য সহ।

আপনি প্রতিটি লেনদেনকে FragmentManager দ্বারা পরিচালিত একটি ব্যাক স্ট্যাকে সংরক্ষণ করতে পারেন, যা ব্যবহারকারীকে ফ্র্যাগমেন্ট পরিবর্তনের মাধ্যমে পিছনের দিকে নেভিগেট করার অনুমতি দেয়—ক্রিয়াকলাপগুলির মাধ্যমে পিছনের দিকে নেভিগেট করার অনুরূপ৷

আপনি beginTransaction() কল করে FragmentManager থেকে FragmentTransaction এর একটি উদাহরণ পেতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val fragmentManager = ...
val fragmentTransaction = fragmentManager.beginTransaction()

জাভা

FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

প্রতিটি FragmentTransaction চূড়ান্ত কলকে অবশ্যই লেনদেন করতে হবে। commit() FragmentManager কল করার সংকেত দেয় যে সমস্ত ক্রিয়াকলাপ লেনদেনে যোগ করা হয়েছে।

কোটলিন

val fragmentManager = ...
// The fragment-ktx module provides a commit block that automatically
// calls beginTransaction and commit for you.
fragmentManager.commit {
    // Add operations here
}

জাভা

FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

// Add operations here

fragmentTransaction.commit();

খণ্ড অবস্থার পরিবর্তনের পুনর্বিন্যাস করার অনুমতি দিন

প্রতিটি FragmentTransaction ব্যবহার করা উচিত setReorderingAllowed(true) :

কোটলিন

supportFragmentManager.commit {
    ...
    setReorderingAllowed(true)
}

জাভা

FragmentManager fragmentManager = ...
fragmentManager.beginTransaction()
    ...
    .setReorderingAllowed(true)
    .commit();

আচরণের সামঞ্জস্যের জন্য, পুনঃক্রম পতাকা ডিফল্টরূপে সক্ষম করা হয় না। তবে, FragmentManager আপনার FragmentTransaction সঠিকভাবে চালানোর অনুমতি দেওয়া প্রয়োজন, বিশেষ করে যখন এটি ব্যাক স্ট্যাকে কাজ করে এবং অ্যানিমেশন এবং ট্রানজিশন চালায়। ফ্ল্যাগ সক্রিয় করা নিশ্চিত করে যে যদি একাধিক লেনদেন একসাথে সম্পাদিত হয়, কোন মধ্যবর্তী টুকরা (অর্থাৎ যেগুলি যোগ করা হয় এবং তারপরে অবিলম্বে প্রতিস্থাপিত হয়) জীবনচক্র পরিবর্তনের মধ্য দিয়ে যায় না বা তাদের অ্যানিমেশন বা ট্রানজিশন কার্যকর হয় না। মনে রাখবেন যে এই পতাকাটি লেনদেনের প্রাথমিক সঞ্চালন এবং popBackStack() এর সাথে লেনদেনের বিপরীত উভয়কেই প্রভাবিত করে।

টুকরা যোগ করা এবং অপসারণ

একটি FragmentManager একটি খণ্ড যুক্ত করতে, লেনদেনে add() কল করুন। এই পদ্ধতিটি ফ্র্যাগমেন্টের জন্য কন্টেইনারের আইডি পায়, সেইসাথে আপনি যে খণ্ডটি যোগ করতে চান তার ক্লাসের নাম। যোগ করা খণ্ডটি RESUMED অবস্থায় সরানো হয়েছে। এটি দৃঢ়ভাবে সুপারিশ করা হয় যে কন্টেইনারটি একটি FragmentContainerView যা ভিউ শ্রেণিবিন্যাসের অংশ।

হোস্ট থেকে একটি ফ্র্যাগমেন্ট অপসারণ করতে, remove() কল করুন, একটি ফ্র্যাগমেন্ট ইন্সট্যান্স পাস করে যা ফ্র্যাগমেন্ট ম্যানেজার থেকে findFragmentById() বা findFragmentByTag() এর মাধ্যমে পুনরুদ্ধার করা হয়েছিল। যদি খণ্ডের দৃশ্যটি পূর্বে একটি পাত্রে যোগ করা হয়, তাহলে এই মুহুর্তে ধারক থেকে দৃশ্যটি সরানো হয়। সরানো খণ্ডটি DESTROYED অবস্থায় সরানো হয়।

আপনার প্রদান করা একটি নতুন ফ্র্যাগমেন্ট ক্লাসের উদাহরণ সহ একটি পাত্রে বিদ্যমান একটি খণ্ড প্রতিস্থাপন করতে replace() ব্যবহার করুন। replace() কল করা একটি কন্টেইনারে একটি ফ্র্যাগমেন্ট সহ remove() কল করা এবং একই পাত্রে একটি নতুন টুকরো যোগ করার সমতুল্য।

নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে আপনি একটি খণ্ডকে অন্যটির সাথে প্রতিস্থাপন করতে পারেন:

কোটলিন

// Create new fragment
val fragmentManager = // ...

// Create and commit a new transaction
fragmentManager.commit {
    setReorderingAllowed(true)
    // Replace whatever is in the fragment_container view with this fragment
    replace<ExampleFragment>(R.id.fragment_container)
}

জাভা

// Create new fragment and transaction
FragmentManager fragmentManager = ...
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setReorderingAllowed(true);

// Replace whatever is in the fragment_container view with this fragment
transaction.replace(R.id.fragment_container, ExampleFragment.class, null);

// Commit the transaction
transaction.commit();

এই উদাহরণে, ExampleFragment এর একটি নতুন উদাহরণ খণ্ডটিকে প্রতিস্থাপন করে, যদি থাকে, যেটি বর্তমানে R.id.fragment_container দ্বারা চিহ্নিত লেআউট কন্টেইনারে রয়েছে।

ডিফল্টরূপে, একটি FragmentTransaction করা পরিবর্তনগুলি ব্যাক স্ট্যাকে যোগ করা হয় না। এই পরিবর্তনগুলি সংরক্ষণ করতে, আপনি FragmentTransactionaddToBackStack() কল করতে পারেন। আরও তথ্যের জন্য, ফ্র্যাগমেন্ট ম্যানেজার দেখুন।

কমিট অসিঙ্ক্রোনাস

commit() কলিং অবিলম্বে লেনদেন সম্পাদন করে না। বরং, লেনদেনটি করতে সক্ষম হওয়ার সাথে সাথে মূল UI থ্রেডে চালানোর জন্য নির্ধারিত হয়েছে। যাইহোক, প্রয়োজনে, আপনি অবিলম্বে আপনার UI থ্রেডে টুকরো লেনদেন চালানোর জন্য commitNow() কল করতে পারেন।

উল্লেখ্য যে commitNow addToBackStack এর সাথে বেমানান। বিকল্পভাবে, আপনি commit() কলের মাধ্যমে জমা দেওয়া সমস্ত মুলতুবি FragmentTransactions চালাতে পারেন যা executePendingTransactions() কল করে এখনও চলেনি। এই পদ্ধতি addToBackStack এর সাথে সামঞ্জস্যপূর্ণ।

বেশিরভাগ ব্যবহারের ক্ষেত্রে, commit() আপনার প্রয়োজন।

অপারেশন অর্ডারিং উল্লেখযোগ্য

একটি FragmentTransaction মধ্যে আপনি যে ক্রমানুসারে ক্রিয়াকলাপগুলি সম্পাদন করেন তা উল্লেখযোগ্য, বিশেষ করে setCustomAnimations() ব্যবহার করার সময়। এই পদ্ধতিটি প্রদত্ত অ্যানিমেশনগুলিকে অনুসরণ করে এমন সমস্ত ফ্র্যাগমেন্ট অপারেশনগুলিতে প্রয়োগ করে৷

কোটলিন

supportFragmentManager.commit {
    setCustomAnimations(enter1, exit1, popEnter1, popExit1)
    add<ExampleFragment>(R.id.container) // gets the first animations
    setCustomAnimations(enter2, exit2, popEnter2, popExit2)
    add<ExampleFragment>(R.id.container) // gets the second animations
}

জাভা

getSupportFragmentManager().beginTransaction()
        .setCustomAnimations(enter1, exit1, popEnter1, popExit1)
        .add(R.id.container, ExampleFragment.class, null) // gets the first animations
        .setCustomAnimations(enter2, exit2, popEnter2, popExit2)
        .add(R.id.container, ExampleFragment.class, null) // gets the second animations
        .commit()

খণ্ডের জীবনচক্র সীমিত করুন

FragmentTransactions লেনদেনের সুযোগের মধ্যে যোগ করা পৃথক খণ্ডের জীবনচক্র অবস্থাকে প্রভাবিত করতে পারে। একটি FragmentTransaction তৈরি করার সময়, setMaxLifecycle() প্রদত্ত ফ্র্যাগমেন্টের জন্য একটি সর্বোচ্চ অবস্থা সেট করে। উদাহরণস্বরূপ, ViewPager2 setMaxLifecycle() ব্যবহার করে অফ-স্ক্রীনের টুকরোগুলিকে STARTED অবস্থায় সীমাবদ্ধ করতে।

খণ্ডের দৃষ্টিভঙ্গি দেখানো এবং লুকানো

FragmentTransaction পদ্ধতি ব্যবহার করুন show() এবং hide() একটি কন্টেইনারে যোগ করা টুকরোগুলির দৃশ্য দেখাতে এবং লুকিয়ে রাখতে। এই পদ্ধতিগুলি খণ্ডের জীবনচক্রকে প্রভাবিত না করেই খণ্ডের দৃষ্টিভঙ্গির দৃশ্যমানতা সেট করে।

একটি খণ্ডের মধ্যে দৃশ্যের দৃশ্যমানতা টগল করার জন্য আপনাকে একটি ফ্র্যাগমেন্ট লেনদেন ব্যবহার করার প্রয়োজন নেই, এই পদ্ধতিগুলি সেই ক্ষেত্রে উপযোগী যেখানে আপনি দৃশ্যমানতার অবস্থার পরিবর্তনগুলি ব্যাক স্ট্যাকের লেনদেনের সাথে যুক্ত করতে চান৷

সংযুক্ত এবং বিচ্ছিন্ন টুকরা

FragmentTransaction পদ্ধতি detach() UI থেকে খণ্ডটিকে বিচ্ছিন্ন করে, এর ভিউ হায়ারার্কি নষ্ট করে। খণ্ডটি একই অবস্থায় থাকে ( STOPPED ) যখন এটিকে পিছনের স্ট্যাকের উপর রাখা হয়। এর মানে হল যে টুকরোটি UI থেকে সরানো হয়েছে কিন্তু এখনও ফ্র্যাগমেন্ট ম্যানেজার দ্বারা পরিচালিত হয়।

attach() পদ্ধতিটি একটি টুকরো পুনরায় সংযুক্ত করে যেখান থেকে এটি পূর্বে বিচ্ছিন্ন ছিল। এর ফলে এর ভিউ হায়ারার্কি পুনরায় তৈরি করা হয়, UI এর সাথে সংযুক্ত করা হয় এবং প্রদর্শিত হয়।

যেহেতু একটি FragmentTransaction অপারেশনের একটি একক পারমাণবিক সেট হিসাবে বিবেচনা করা হয়, একই লেনদেনে একই টুকরো ইন্সট্যান্সকে detach এবং attach জন্য উভয়কে কল কার্যকরভাবে একে অপরকে বাতিল করে, এইভাবে খণ্ডটির UI এর ধ্বংস এবং তাত্ক্ষণিক বিনোদন এড়ানো যায়। আলাদা লেনদেন ব্যবহার করুন, executePendingOperations() দ্বারা পৃথক করা হলে commit() ব্যবহার করুন, যদি আপনি আলাদা করতে চান এবং তারপর অবিলম্বে একটি খণ্ড পুনরায় সংযুক্ত করতে চান।