متد popBackStack جهت پاک کردن استک
متد popBackStack اوور لودهای زیر را دارد:
popBackStack(int, int)
popBackStack(String, int)
آرگومان اول بصورت int اندیس مورد نظر برای استک را میگیرد. مثلا اگر فرگمنت ها این ترتیب را داشته باشند:
A > B > C
و این متد به صورت زیر فراخوانی شود:
popBackStack(0, 0);
فرگمنت A نمایش داده خواهد شد.
آرگومان اول بصورت String اسم استک را میگیرد. یعنی وقتی که transition رو در استک سیو میکنیم یک اسم به آن اختصاص داده میشود. به این صورت:
fragmentManager
.beginTransaction()
.replace(R.id.frag_container, fragmentOne)
.addToBackStack("salam")
.commit();
getSupportFragmentManager().popBackStack("salam",0);
در این صورت پس از پاپ کردن، fragmentOne نمایش داده خواهد شد.
آرگومان دوم در هر دو یک فلگ است که مقدار آن صفر یا یک می باشد.
FragmentManager.POP_BACK_STACK_INCLUSIVE این همون یک هست
مقداری برای صفر تعریف نشده ولی EXCLUSIVE هست.
تفاوت INCLUSIVE و EXCLUSIVE:
getSupportFragmentManager().popBackStack("frag two",0); // POP_BACK_STACK_EXCLUSIVE
getSupportFragmentManager().popBackStack("frag two",1); // POP_BACK_STACK_INCLUSIVE
در INCLUSIVE فرگمنت مقصد یا destination (در اینجا یعنی frag two) هم میپره و به فرگمنت قبل از فرگمنت مقصد میره. (اگر فرگمنتی قبلش نبود کلا هیچی نشون داده نمیشه دیگه)
ولی در EXCLUSIVE فرگمنت مقصد باقی میمونه. بخاطر همین برای پاک کردن کلی فرگمنت ها از INCLUSIVE استفاده میشه.
نکته شاید جالب: کد
getSupportFragmentManager().popBackStack(null,0); // POP_BACK_STACK_EXCLUSIVE
مثل
getSupportFragmentManager().popBackStack();
عمل میکنه. یعنی فرگمنت ها رو دونه دونه pop میکنه.
برای پاک کردن کل استک دو روش وجود دارد:
روش اول:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
روش دوم:
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
به جای popBackStack میشه از popBackStackImmediate نیز استفاده کرد. گویا دومی زودتر به جواب میرسه ولی اولی نسبت به بقیه کد آسنکرون هست و توی لوپ و در ترد اصلی اجرا میشه.