Как управлять Backstack с дочерними фрагментами?
У меня проблемы с вложенными / дочерними фрагментами. Мой вариант использования: у меня есть Frag A в качестве родительского фрагмента и FragChild1
, FragChild2
, FragChild3
как дочерние фрагменты для отображения внутри Frag A
, Теперь при обратном нажатии от FragChild3 это должно работать так:
FragChild3 -> FragChild2 -> FragChild1 -> FragA (ParentFrag).
Код, который я использовал для добавления дочерних фрагментов,
for ChildFrag1-
Fragment mChildFragment1 = new ChildFragment1();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.replace(R.id.container_view, mChildFragment1);
transaction.addToBackStack("FragChild1");
transaction.commit();
for ChildFrag2-
Fragment mChildFragment2 = new ChildFragment2();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.replace(R.id.container_view, mChildFragment2);
transaction.addToBackStack("FragChild2");
transaction.commit();
Я искал в Stackru соответствующие ответы, но пока не нашел ни одного правильного ответа / способа управления обратным стеком для дочерних фрагментов.
4 ответа
Ваш код кажется хорошим. Просто переопределить onbackpressed
метод в деятельности, который содержит родительский фрагмент и помещает в него заданный код.
if (parentfragment.getChildFragmentManager().getBackStackEntryCount() > 1) {
parentfragment.getChildFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
Теперь это поведение можно реализовать с помощью OnBackPressedDispatcher без переопределения
onBackPressed
в действии .
В родительском фрагменте (где находится контейнер для фрагментов) добавьте этот код в
onAttach
метод:
override fun onAttach(context: Context) {
super.onAttach(context)
val backCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Remove all fragments from the childFragmentManager,
// but exclude the first added child fragment.
// This child fragment will be deleted with its parent.
if (childFragmentManager.backStackEntryCount > 1) {
childFragmentManager.popBackStack()
return
}
// Delete parent fragment
parentFragmentManager.popBackStack()
}
}
requireActivity().onBackPressedDispatcher.addCallback(this, backCallback)
}
Затем добавьте фрагменты в свой контейнер следующим образом:
childFragmentManager.commit {
replace(R.id.fragmentContainerRoot, fragment)
addToBackStack(null)
}
Попробуй это,
Fragment fragment= new ChildFragment1();
getChildFragmentManager().beginTransaction().replace(R.id.contentView, fragment).addToBackStack(fragment.getClass().getName()).commitAllowingStateLoss();
Передайте тег в метод замены. TAG может так же просто, как имя фрагмента (String). Измените свой код следующим образом:
transaction.replace(R.id.container_view, mChildFragment1, "FragChild1");
transaction.addToBackStack("FragChild1");
transaction.commit();