Например,
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.
- Иначе, есть ли идеи по добавлению фрагмента в стек при возвращении таким образом?
Вот пример псевдоишного кода того, что я пробовал. Я не пытаюсь одновременно показать B + C, чтобы казалось, что вы перемещаетесь по A -> C.
Действия
Код: Выделить всё
Код: Выделить всё
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();
Теперь я хочу перейти к 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();
РЕДАКТИРОВАТЬ: Хорошо, вместо этого изменение FragmentB на «Добавить» в основном работает. Но это означает, что «поп» FragmentB не анимирует FragmentA, он просто статичен (поскольку он был добавлен, я думаю, а не заменен). Не уверен, могу ли я что-нибудь сделать, чтобы решить эту проблему? Если я выполняю «Заменить», FragmentA исчезает из-за второй транзакции, если я выполняю «Добавить», он работает, но визуально не анимируется (сдвигается) неправильно при возвращении обратно.
Подробнее здесь: https://stackoverflow.com/questions/798 ... insert-a-n
Мобильная версия