Как управлять 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();
Другие вопросы по тегам