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

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

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

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

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

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

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

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


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

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


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

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

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

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


comment
Пробовали ли вы применить setReorderingAllowed(false) до совершения транзакции?   -  person azizbekian    schedule 02.11.2017
comment
@azizbekian, который доступен только в API 26+   -  person zafrani    schedule 02.11.2017
comment
Не совсем так, фрагменты поддержки доступны как минимум для API 14 и выше.   -  person azizbekian    schedule 02.11.2017
comment
Извините, я не использую диспетчер фрагментов поддержки   -  person zafrani    schedule 02.11.2017
comment
Для фрагментов фреймворка используйте setAllowOptimization(false).   -  person azizbekian    schedule 02.11.2017
comment
Я вижу, что в диспетчере фрагментов поддержки developer.android.com/reference /android/support/v4/app/, но не в developer.android.com/reference/android/app/   -  person zafrani    schedule 02.11.2017
comment
Каковы ваши доводы в пользу использования фрагментов вместо фрагментов поддержки?   -  person Tobias Ettrup Mølbak    schedule 07.11.2017
comment
Я не поддерживаю API до 19.   -  person zafrani    schedule 07.11.2017
comment
@Zafrani Вы пытались установить высоту для закрываемого фрагмента ниже, а не поднимать фрагмент, который делает вход?   -  person Joey Harwood    schedule 08.11.2017
comment
@JoeyHarwood Да, но это не работает для API 19, когда мне приходится использовать View.setElevation   -  person zafrani    schedule 08.11.2017
comment
Я не уверен, что на самом деле можно обойти эту проблему, но простой способ подделать ее - быстро скрыть текущий фрагмент, пока входящий фрагмент переходит.   -  person Brian Yencho    schedule 08.11.2017
comment
Мы делаем что-то очень похожее с точки зрения двух фрагментов и анимации. Единственная разница в том, что мы анимируем не фрагменты, а содержимое внутри них. Таким образом, в основном мы бы анимировали содержимое нижнего фрагмента (в то время как все дочерние элементы верхнего фрагмента невидимы). После завершения анимации нижнего фрагмента мы запускаем анимацию верхнего фрагмента и удаляем нижний фрагмент, чтобы получить плавные переходы внутри фрагментов. Не знаю, сработает ли это для вас, но попробовать стоит.   -  person the-ginger-geek    schedule 10.11.2017
comment
Пожалуйста, опубликуйте полный пример (Github) или хотя бы код onCreateAnimator и определения анимации.   -  person artkoenig    schedule 15.11.2017
comment
Вы можете опубликовать скриншот вашей проблемы? может быть я могу помочь с просмотрами   -  person Aks4125    schedule 15.11.2017


Ответы (1)


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

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

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

person Dimezis    schedule 12.11.2017
comment
Боюсь, что это единственный вариант, который у меня есть. - person zafrani; 13.11.2017