Заменяющие фрагменты имеют неверное значение высоты

Привет снова стека переполнения. У меня есть еще один фрагмент вопроса. (Я использую android.app. Фрагмент не поддерживает фрагменты)

Я пытаюсь заменить фрагмент. Но это не так просто, как использовать:

fragmentTransaction
    .replace(containerId, newFragment)
    .addToBackStack("unique tag")
    .commit()

Почему бы и нет? Хороший вопрос, друзья, потому что мой newFragment имеет анимацию перехода.

Где определяется анимация? Еще один большой вопрос, он определен во фрагментах onCreateAnimator()

Почему это там определено? Длинный ответ на вопрос, почему можно найти: Вложенные фрагменты перемещаются неправильно. На данный момент вы должны верить, что так должно быть в моем проекте.

Что делает анимация? Простая прокрутка от края экрана в центр, полностью закрывающая оригинальный фрагмент. Имейте в виду, что в этом сценарии старый фрагмент просто сидит на месте. Он имеет эффект анимации, чтобы не двигаться.


В чем проблема?

Проблема в том, что newFragment, похоже, имеет более низкое значение высоты (или z?), Чем старое. Таким образом, переход не может наблюдаться, потому что старый фрагмент находится над новым фрагментом. По окончании анимации вы видите, что новый фрагмент мигает над старым. Я ожидал, что новый фрагмент закроет старый с начала анимации.


Почему бы не использовать добавить? Это, кажется, создает больше проблем, так как у меня есть много фрагментов, которые я хочу поменять местами. Кажется, использование add вызывает их анимацию выхода при следующем использовании замены, даже если перед ним есть 1... n фрагментов. Они также не делают паузу.

Почему бы не установить высоту? Потому что я поддерживаю API 19, который не имеет свойства высоты.

Почему бы не использовать ViewCompat.setElevation() для API 19? Я попробовал это и получил те же самые неудачные результаты.

Кто-нибудь нашел способ обойти эту проблему?

1 ответ

У меня была такая же проблема, и я потратил довольно много времени, пытаясь ее исправить. К сожалению, по моему опыту, в этой установке нет способа заставить его работать для API <=19.

ViewCompat.setElevation() это просто NoOp для <=19 API, поэтому он не может работать. Начиная с SDK 21, он устанавливает высоту и решает проблему. Настройка Z index также работает.

Единственное, что я могу посоветовать, это изменить переход для API <=19, чтобы он не зависел от индекса Z в любом случае. И для 21+ используйте переход, который вы хотели. Я так и сделал, и я думаю, что это нормально, потому что большинство пользователей старше 21 года.