প্রকৃতপক্ষে স্ট্যাকটিতে কোনও সর্বশেষ খণ্ড যুক্ত হয়নি কারণ আপনি একক লেনদেনে স্ট্যাকটিতে কয়েকটি বা টুকরো যোগ করতে পারেন বা একটি নতুন যুক্ত না করে কেবল খণ্ডগুলি সরাতে পারেন।
আপনি যদি সত্যিই টুকরো টুকরো টুকরো করতে চান এবং স্ট্যাকের সূচক দ্বারা কোনও টুকরোটি অ্যাক্সেস করতে সক্ষম হন তবে আপনার FragmentManager
এবং এর পিছনের দিকের উপর একটি বিমূর্ত স্তর আরও ভাল হবে । আপনি এটি কীভাবে করতে পারেন তা এখানে:
public class FragmentStackManager {
private final FragmentManager fragmentManager;
private final int containerId;
private final List<Fragment> fragments = new ArrayList<>();
public FragmentStackManager(final FragmentManager fragmentManager,
final int containerId) {
this.fragmentManager = fragmentManager;
this.containerId = containerId;
}
public Parcelable saveState() {
final Bundle state = new Bundle(fragments.size());
for (int i = 0, count = fragments.size(); i < count; ++i) {
fragmentManager.putFragment(state, Integer.toString(i), fragments.get(i));
}
return state;
}
public void restoreState(final Parcelable state) {
if (state instanceof Bundle) {
final Bundle bundle = (Bundle) state;
int index = 0;
while (true) {
final Fragment fragment =
fragmentManager.getFragment(bundle, Integer.toString(index));
if (fragment == null) {
break;
}
fragments.add(fragment);
index += 1;
}
}
}
public void replace(final Fragment fragment) {
fragmentManager.popBackStackImmediate(
null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction()
.replace(containerId, fragment)
.addToBackStack(null)
.commit();
fragmentManager.executePendingTransactions();
fragments.clear();
fragments.add(fragment);
}
public void push(final Fragment fragment) {
fragmentManager
.beginTransaction()
.replace(containerId, fragment)
.addToBackStack(null)
.commit();
fragmentManager.executePendingTransactions();
fragments.add(fragment);
}
public boolean pop() {
if (isEmpty()) {
return false;
}
fragmentManager.popBackStackImmediate();
fragments.remove(fragments.size() - 1);
return true;
}
public boolean isEmpty() {
return fragments.isEmpty();
}
public int size() {
return fragments.size();
}
public Fragment getFragment(final int index) {
return fragments.get(index);
}
}
এখন পরিবর্তে যুক্ত করা এবং কল করে টুকরা অপসারণ FragmentManager
সরাসরি, আপনি ব্যবহার করা উচিত push()
, replace()
এবং pop()
পদ্ধতি FragmentStackManager
। এবং আপনি কেবল কল করে শীর্ষস্থানীয় খণ্ডটি অ্যাক্সেস করতে সক্ষম হবেন stack.get(stack.size() - 1)
।
তবে আপনি যদি হ্যাক পছন্দ করেন তবে আমার কাছে অনুরূপ কাজ করার অন্যান্য উপায়ও রয়েছে। আমার কেবলমাত্র উল্লেখ করতে হবে এই হ্যাকগুলি কেবল সমর্থন টুকরা দিয়ে কাজ করবে।
প্রথম হ্যাকটি কেবল খণ্ড ব্যবস্থাপকের সাথে সমস্ত সক্রিয় টুকরো যোগ করা। আপনি যদি কেবল একের পর এক টুকরো প্রতিস্থাপন করেন এবং স্ট্যাক থেকে পপ করেন তবে এই পদ্ধতিটি শীর্ষস্থানীয় খণ্ডটি ফিরে আসবে:
public class BackStackHelper {
public static List<Fragment> getTopFragments(
final FragmentManager fragmentManager) {
final List<Fragment> fragments = fragmentManager.getFragments();
final List<Fragment> topFragments = new ArrayList<>();
for (final Fragment fragment : fragments) {
if (fragment != null && fragment.isResumed()) {
topFragments.add(fragment);
}
}
return topFragments;
}
}
দ্বিতীয় পদ্ধতির ইভেন্টটি আরও হ্যাকি এবং আপনাকে সর্বশেষ লেনদেনে যার জন্য addToBackStack
ডাকা হয়েছিল তাতে সমস্ত টুকরো যোগ করার অনুমতি দেয় :
package android.support.v4.app;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BackStackHelper {
public static List<Fragment> getTopFragments(
final FragmentManager fragmentManager) {
if (fragmentManager.getBackStackEntryCount() == 0) {
return Collections.emptyList();
}
final List<Fragment> fragments = new ArrayList<>();
final int count = fragmentManager.getBackStackEntryCount();
final BackStackRecord record =
(BackStackRecord) fragmentManager.getBackStackEntryAt(count - 1);
BackStackRecord.Op op = record.mHead;
while (op != null) {
switch (op.cmd) {
case BackStackRecord.OP_ADD:
case BackStackRecord.OP_REPLACE:
case BackStackRecord.OP_SHOW:
case BackStackRecord.OP_ATTACH:
fragments.add(op.fragment);
}
op = op.next;
}
return fragments;
}
}
দয়া করে লক্ষ্য করুন যে এই ক্ষেত্রে আপনাকে এই ক্লাসটি android.support.v4.app
প্যাকেজে রাখতে হবে।
FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
বাFragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
ডক