Android: Как изменить стек FragmentManager при возврате назад (вставить новый фрагмент)?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android: Как изменить стек FragmentManager при возврате назад (вставить новый фрагмент)?

Сообщение Anonymous »

Я пытаюсь добавить представление в стек фрагментов без каких-либо видимых указаний на то, что это произошло, поэтому оно появляется при возврате назад.
Например,
3 фрагмента, A, B и C
A -> C
Затем, возвращаясь НАЗАД из C, я хочу, чтобы B появился (т. е. мы «пропустили» его)
C -> B -> A
Моя проблема в том, что все они должны быть совместимы с backstack + анимацией.
Я могу показать B, перехватив обратное событие и выполнив транзакцию фрагмента, чтобы заменить C на B (и инвертировать анимацию, чтобы она «входила», как будто C выскочил), но затем возвращение назад меняет это, поэтому я застреваю в цикле C -> B -> C -> B.
Я сначала пытаюсь вызвать PopBackstack, прежде чем выполняет транзакцию, но затем C просто «исчезает» при входе B - но затем возврат из B -> A работает нормально.
  • В качестве альтернативы, лучше ли как-то добавить B + C одновременно при переходе от A -> C, и если да, то как лучше всего это сделать, чтобы с обратным стеком тоже все было в порядке? Имея в виду, B не должен быть виден, поэтому визуально он анимируется от A -> C.
  • Иначе, есть ли идеи по добавлению фрагмента в стек при возвращении таким образом?
И нет, Compose не вариант.
Вот пример псевдоишного кода того, что я пробовал. Я не пытаюсь одновременно показать B + C, чтобы казалось, что вы перемещаетесь по A -> C.
Действия Итак, сначала я показываю фрагмент A, который показан со следующей грубой транзакцией

Код: Выделить всё

var fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.setCustomAnimations(slide_left_in, slide_left_out, slide_right_out, slide_right_in)
.replace("@id/content_frame", fragmentA)
.addToBackStack("A")
.commitAllowingStateLoss();
Это не на 100 % выше, так как к этому моменту я глубоко разбираюсь в различных других представлениях, но, по сути, FragmentA в настоящее время является активным фрагментом в content_frame и работает нормально.
Теперь я хочу перейти к C, но с B «скрытым» между ними. Итак, как предложил /u/ianhanniballake, я делаю их как две транзакции (так что они обе находятся в стеке). Однако в настоящее время это не работает...

Код: Выделить всё

fragmentManager.beginTransaction()
.setCustomAnimations(slide_left_in, slide_left_out, slide_right_out, slide_right_in)
.replace("@id/content_frame", fragmentB)
.addToBackStack("B")
.commitAllowingStateLoss();

// If I don't do this, the second transaction appears to never execute so just FragmentB appears
fragmentManager.ExecutePendingTransactions();

fragmentManager.beginTransaction()
.setCustomAnimations(slide_left_in, slide_left_out, slide_right_out, slide_right_in)
.replace("@id/content_frame", fragmentC)
.addToBackStack("C")
.commitAllowingStateLoss();
По сути, я вижу, что FragmentA уничтожается и исчезает перед его анимацией, поэтому затем я вижу, как фрагмент C скользит по «ничто», но затем возвращение назад работает нормально, видя FragmentB, затем FragmentA.
РЕДАКТИРОВАТЬ: Хорошо, вместо этого изменение FragmentB на «Добавить» в основном работает. Но это означает, что «поп» FragmentB не анимирует FragmentA, он просто статичен (поскольку он был добавлен, я думаю, а не заменен). Не уверен, могу ли я что-нибудь сделать, чтобы решить эту проблему? Если я выполняю «Заменить», FragmentA исчезает из-за второй транзакции, если я выполняю «Добавить», он работает, но визуально не анимируется (сдвигается) неправильно при возвращении обратно.

Подробнее здесь: https://stackoverflow.com/questions/798 ... insert-a-n
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»