fragManager.getBackStackEntryCount () не уменьшается при удалении фрагмента из менеджера. - PullRequest
0 голосов
/ 06 ноября 2018

Правильное поведение, которое я хотел бы иметь:

Fragment A -> Fragment B -> Fragment C -> Fragment A

Что я сейчас делаю:

  1. Когда я хочу вернуться от B к A, я использую popBackStack() все еще здесь все идет хорошо.
  2. Когда я хочу перейти от B к C, я удаляю B и добавить C. (количество фрагментов 2, число backStackEntryCount 3, то же самое для замены).
  3. Когда я хочу вернуться из C в A, я могу использовать popBackStack() но BackStackEntryCount все равно будет содержать запись для Б.

Мне действительно нужно, чтобы backStackEntryCount был таким же, как фрагменты, содержащиеся в менеджере.

Кто-нибудь знает, что я делаю не так?

Мой код:

        Fragment fragment1 = fragmentManager.findFragmentByTag("NavigationFragment_");
    if (fragment1 != null) {
        fragmentManager.beginTransaction()
                .setTransition(TRANSIT_FRAGMENT_FADE)
                .remove(fragment1)
                .commit();

    }

    fragmentManager.beginTransaction()
            .addToBackStack(backstack)
            .setTransition(TRANSIT_FRAGMENT_OPEN)
            //.remove(getFragmentManager().findFragmentByTag(NavigationFragment_.class.getSimpleName()))
            .add(R.id.fragmentContainer, fragment, fragment.getClass().getSimpleName())
            .commit();

Я какое-то время искал решение без результатов, поэтому, пожалуйста, не отмечайте его как дубликат.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Если вы пришли сюда, потому что вы вызываете popBackStack (), но getBackStackEntryCount (), похоже, не обновляется, то вы можете вместо этого попробовать popBackStackImmediate ().

popBackStack () является асинхронным - он ставит в очередь запрос на извлечение, но действие не будет выполнено, пока приложение не вернется в свой цикл обработки событий.

0 голосов
/ 19 ноября 2018

Задний стек FragmentManager обновляется только в двух случаях:

  1. Вы совершаете транзакцию FragmentTransaction, используя addToBackStack()
  2. Звоните popBackStack()

Никакая другая операция не влияет на задний стек - дополнительные FragmentTransactions без addToBackStack() только изменяют текущее состояние и не влияют на то, что происходит при вызове popBackStack() и т. Д.

Если вы хотите, чтобы ваш стек перешел с A на A -> B, вы должны использовать FragmentTransaction с addToBackStack (и, как правило, replace операция):

fragmentManager.beginTransaction()
    .replace(R.id.fragmentContainer, fragmentB)
    .addToBackStack("b")
    .commit();

Затем вы хотите, чтобы ваш стек обратно составлял от A -> B до A -> C, вам необходимо выполнить две операции:

// First pop B
fragmentManager.popBackStack("b", FragmentManager.POP_BACK_STACK_INCLUSIVE)
// Then addToBackStack C
fragmentManager.beginTransaction()
    .replace(R.id.fragmentContainer, fragmentC)
    .addToBackStack("c")
    .commit();

Это гарантирует, что ваш FragmentB будет удален из стека перед добавлением FragmentC в задний стек.

Аналогичным образом, если вы хотите удалить FragmentC и вернуться к FragmentA, вы просто вытолкнете его из заднего стека:

// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)

Примечание: никогда не рекомендуется смешивать обратно стек FragmentTransactions и обычные FragmentTransactions в одном и том же FragmentManager, поскольку popBackStack() не учитывает текущее состояние FragmentManager, а вместо этого просто слепо инвертирует FragmentTransaction на задний стек (т. е. последняя транзакция Fragment с addToBackStack().

...