BackStackEntryCount и FragmentManager - PullRequest
       1

BackStackEntryCount и FragmentManager

0 голосов
/ 19 сентября 2019

Я много искал и нашел много объяснений по Интернету, но моя путаница все еще там о Fragments и FragmentManager и findFragmentByTag

Предположим, у меня есть три фрагмента FragmentA,FragmentB,FragmentC и A, B, C являются их тегами соответственно

Я выполнил FragmentTransaction в такой последовательности:

1- Добавить FragmentA {BackStackEntryCount = 1, BackStack = [A]}

2- Добавить фрагмент B {BackStackEntryCount = 2, BackStack = [B, A]}

3- Добавить фрагмент A {BackStackEntryCount = 3, BackStack = [A, B, A]}

4- Добавить фрагментC {BackStackEntryCount = 4, BackStack = [C, A, B, A]}

5- Заменить фрагментA {BackStackEntryCount = 5, BackStack = [A]}

После шага 5 он показывает, что replace удалит (уничтожит) все существующие fragments из BackStack и добавит новый, но BackStackEntryCount, показывая, что он запомнил / сохранил 5 транзакций. Итак, у меня есть FragmentAсверху и показывает пользователю.Проблема в том, что если сейчас я выполню:

supportFragmentManager.findFragmentByTag("A") // returns null But it should return FragmentA? But why it is returning null?
supportFragmentManager.fragments // shows that FragmentA in returned List

Я считаю, что BackStackEntryCount запомнил только общее количество транзакций, сохраненных addToBackStack("SOME_TAG" or null), но не обновляет его, когда replace удаляет все фрагменты из FragmentManager.Пожалуйста, помогите мне прояснить мое понимание.

1 Ответ

0 голосов
/ 21 сентября 2019

Документация по методу findFragmentByTag

Находит фрагмент, который был идентифицирован данным тегом либо при накачке из XML, либо при предоставлении при добавлении в транзакцию.

supportFragmentManager
    .beginTransaction()
    .replace(R.id.container, fragment, "TAG")
    .addToBackStack("StackFrameName")
    .commit()

Тег задается в методах replace или add или в XML.

addToBackStack принимает имя стекового кадра, который можно использовать для поиска кадров стека, но не фрагментовсами по себе.

replace заменяет фрагмент в указанном идентификаторе на предоставленный add добавляет фрагмент к представлению.

Большая разница в этих методах add добавляет свои представленияв контейнер, тогда как replace заменяет представления в контейнере собственными представлениями.Не влияет на обратный стек, если в транзакцию не добавлен код обратного стека.

Обновление:

Когда вы заменяете фрагмент или удаляете фрагмент, он больше не присоединяется к диспетчеру фрагментов, чтобы бытьможно найти по тегу, но если он был добавлен в задний стек, вы можете присоединить его к диспетчеру фрагментов, вставляя задний стек, пока он не вернется.Для этого StackFrameName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...