Подтвердить что ты не робот

Замена фрагментов имеет неправильное значение высоты

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

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

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

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

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

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

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


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

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


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

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

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

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

4b9b3361

Ответ 1

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

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

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