কিছুটা উন্নত এবং একটি ম্যানেজার সমাধানে মোড়ানো।
জিনিষ মনে রাখা। ফ্র্যাগমেন্টম্যানেজার কোনও সিঙ্গলটন নয়, এটি কেবল ক্রিয়াকলাপের মধ্যেই অংশগুলি পরিচালনা করে, তাই প্রতিটি ক্রিয়াকলাপে এটি নতুন হবে। এছাড়াও, এই সমাধানটি এখনও অবধি ভিউপাগারকে বিবেচনায় নেয় না যা সেটউজারভিজিবলহিন্ট () পদ্ধতিটিকে টুকরোগুলির দৃশ্যমানতা নিয়ন্ত্রণ করতে সহায়তা করে calls
এই সমস্যাটি মোকাবেলায় নিখরচায় ক্লাসগুলি ব্যবহার করুন (ডাগার 2 ইনজেকশন ব্যবহার করুন)। ক্রিয়াকলাপে কল করুন:
FragmentManager fragmentManager = getSupportFragmentManager();
myFragmentBackstackStateManager.apply(fragmentManager);
ফ্রেগমেন্টব্যাকস্ট্যাক স্টেট ম্যানেজ.আরভা:
@Singleton
public class FragmentBackstackStateManager {
private FragmentManager fragmentManager;
@Inject
public FragmentBackstackStateManager() {
}
private BackstackCallback backstackCallbackImpl = new BackstackCallback() {
@Override
public void onFragmentPushed(Fragment parentFragment) {
parentFragment.onPause();
}
@Override
public void onFragmentPopped(Fragment parentFragment) {
parentFragment.onResume();
}
};
public FragmentBackstackChangeListenerImpl getListener() {
return new FragmentBackstackChangeListenerImpl(fragmentManager, backstackCallbackImpl);
}
public void apply(FragmentManager fragmentManager) {
this.fragmentManager = fragmentManager;
fragmentManager.addOnBackStackChangedListener(getListener());
}
}
ফ্র্যাগমেন্টব্যাকস্ট্যাক চেঞ্জলিস্টার আইপল.জভা:
public class FragmentBackstackChangeListenerImpl implements FragmentManager.OnBackStackChangedListener {
private int lastBackStackEntryCount = 0;
private final FragmentManager fragmentManager;
private final BackstackCallback backstackChangeListener;
public FragmentBackstackChangeListenerImpl(FragmentManager fragmentManager, BackstackCallback backstackChangeListener) {
this.fragmentManager = fragmentManager;
this.backstackChangeListener = backstackChangeListener;
lastBackStackEntryCount = fragmentManager.getBackStackEntryCount();
}
private boolean wasPushed(int backStackEntryCount) {
return lastBackStackEntryCount < backStackEntryCount;
}
private boolean wasPopped(int backStackEntryCount) {
return lastBackStackEntryCount > backStackEntryCount;
}
private boolean haveFragments() {
List<Fragment> fragmentList = fragmentManager.getFragments();
return fragmentList != null && !fragmentList.isEmpty();
}
private Fragment getParentFragment() {
List<Fragment> fragmentList = fragmentManager.getFragments();
return fragmentList.get(Math.max(0, fragmentList.size() - 2));
}
@Override
public void onBackStackChanged() {
int currentBackStackEntryCount = fragmentManager.getBackStackEntryCount();
if (haveFragments()) {
Fragment parentFragment = getParentFragment();
if (parentFragment != null) {
if (wasPushed(currentBackStackEntryCount)) {
backstackChangeListener.onFragmentPushed(parentFragment);
} else if (wasPopped(currentBackStackEntryCount)) {
backstackChangeListener.onFragmentPopped(parentFragment);
}
}
}
lastBackStackEntryCount = currentBackStackEntryCount;
}
}
ব্যাকস্ট্যাকক্যালব্যাক.জভা:
public interface BackstackCallback {
void onFragmentPushed(Fragment parentFragment);
void onFragmentPopped(Fragment parentFragment);
}