Предотвращение уничтожения (или восстановления состояния) фрагмента B при переходе назад из D - Компонент навигации - PullRequest
1 голос
/ 01 февраля 2020

У меня есть фрагменты: A, B, C, D. Навигация A -> B. Фрагмент B получает и сохраняет состояние из аргументов. Затем я перемещаюсь B -> C. И затем C -> D. Когда я звоню два раза findNavController().popBackStack(), я получаю правильное поведение: D -> B, и B все еще имеет правильное состояние. Это работает, потому что фрагмент B никогда не был уничтожен, только его вид. А потом вид воссоздается при возвращении. Но вызывать popBackStack () два раза не рекомендуется. Вместо этого мы должны использовать действие с app:popUpTo и app:popUpToInclusive="true":

<action
    android:id="@+id/action_fragmentD_to_fragmentB"
    app:destination="@id/fragmentB"
    app:popUpTo="@+id/fragmentB"
    app:popUpToInclusive="true" />

Но это заставляет фрагмент B быть полностью уничтоженным и затем воссозданным. Bu с без предыдущего состояния .

Другими словами, я хочу добиться того же поведения, что и при действиях при использовании FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP: https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Нет необходимости иметь app:destination="@id/fragmentB" для действия, если вы не хотите переходить к новому экземпляру fragmentB (поскольку это то, что делает app:destination). Поэтому вы можете использовать:

<action
    android:id="@+id/action_fragmentD_to_fragmentB"
    app:popUpTo="@+id/fragmentB" />

Это идентично вызову popBackStack(R.id.fragmentB, false) - т.е. вернуться к fragmentB, но не выдвигать fragmentB само по себе.

0 голосов
/ 11 февраля 2020

Вы можете использовать класс SingleLiveEvent , чтобы сохранить предыдущее состояние, поскольку он генерирует данные только один раз, когда это необходимо.

Подробнее о SingleLiveEvent:

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