MainFragment запускает FragA, который запускает FragB, который запускает FragC.

Нажатие кнопки «Назад» на FragB должно перейти к FragA, а нажатие на кнопку FragC также должно перейти к FragA. FragB единственный, где isToAddToBackStack равен false.

childFragmentManager.commit {
        replace(containerViewId, fragment, fragment::class.java.name)

        if (isToAddToBackStack) {
            addToBackStack(backStateName)
        }
    }

При каждом нажатии кнопки «Назад» на FragC отображается FragB:

if (childFragmentManager.backStackEntryCount > 1) {
                childFragmentManager.popBackStack()
                return
}

Какой лучший способ добиться навигации, которую я ожидаю?

0
Favolas 13 Дек 2019 в 14:45

1 ответ

Фрагмент транзакции может включать два разных типа тегов. Большинство разработчиков Android знакомы с тегом Fragment, который вы можете использовать для поиска определенного фрагмента в FragmentManager позже через findFragmentByTag(). Это полезно для поиска фрагмента, когда ваше приложение находится в определенном состоянии, но имейте в виду, что этот фрагмент необходимо добавить в ваш FragmentManager. Если у вас есть removed() или replaced() фрагмент и вы не добавили его в задний стек, вы не сможете его найти.

Другой тип тега - это имя BackStackRecord, переданное в addToBackStack(). Это имя идентифицирует конкретную запись обратного стека, которая является записью того, что произошло в конкретной транзакции. popBackStackImmediate() и его аналоги имеют варианты, которые принимают имя записи заднего стека, чтобы вернуть задний стек в определенное состояние.

   //fm is FragmentManager
  // Fragment a is on the screen
     Fragment a = new A_Fragment()
     fm.beginTransaction()
       .remove(null /*no fragments in R.id.content*/)
       .add(R.id.content, aFragment, "fragment-a")
       .commit();


   // user wants to go from A to B
     Fragment bFragment = new B_Fragment();
     fm.beginTransaction()
       .remove(fm.findFragmentById(R.id.content)) 
       .add(R.id.content, bFragment, "fragment-b")
       .addToBackStack("a")
       .commit();

   // user wants to go from B to C
       fm.beginTransaction()
         .remove(fm.findFragmentById(R.id.content)) 
         .add(R.id.content, new C_Fragment(), "fragment-c")
         .commit();
0
Sanjay Bhalani 13 Дек 2019 в 16:24