Анимация фрагментов и заднего стека

У меня проблемы с использованием или с пониманием того, как извлечение FragmentTransactions из заднего стека обрабатывает настраиваемые анимации. В частности, я ожидаю, что он вызовет анимацию «выхода», но, похоже, это не так.

У меня есть простой метод обработки транзакции фрагмента (FragmentTransaction), где я добавляю фрагмент и применяю настраиваемый переход, чтобы он постепенно появлялся / затухал. Я также добавляю это в задний стек, чтобы пользователь мог отменить эту транзакцию с помощью кнопки возврата, по сути переходя в состояние до добавления фрагмента.

protected void changeFragment() { 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    ft.add(R.id.fragment_container, new TestFragment()); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

Все отлично работает при движении вперед, но когда пользователь нажимает кнопку «Назад», анимация перехода не меняется. Я ожидал, что когда фрагмент будет удален, он будет использовать анимацию исчезновения. Вместо этого кажется, что он выскакивает (без анимации), а затем кажется, что контейнер исчезает. Я не уверен, что это именно то, что происходит, но фрагмент определенно не исчезает.

Мое приложение использует библиотеку совместимости для добавления поддержки фрагментов, но я предполагаю, что это применимо и к Honeycomb (android-11). Кто-нибудь знает, делаю ли я здесь что-то не так или просто жду слишком многого? В идеале я хотел бы анимировать фрагменты аналогично тому, как это делает Gmail (на Xoom) в отношении движения вперед, щелкнув сообщение, а затем назад, используя кнопку «Назад». Желательно не переопределять функциональность кнопки «Назад» и не отставать от моего собственного состояния фрагмента, поскольку у меня может быть несколько «транзакций», от которых я хотел бы отказаться, и я не фанат заново изобретать колеса.

Также спрашивают в группе разработчиков Android: http://groups.google.com/group/android-developers/browse_thread/thread/1136a3a70fa0b6e9


person Kelly Merrell    schedule 16.03.2011    source источник
comment
Я также столкнулся с этой проблемой и отправил отчет об ошибке здесь code.google.com/p/android/issues/   -  person Damian    schedule 20.03.2011
comment
Не могли бы вы пометить вышеупомянутый отчет об ошибке.   -  person Damian    schedule 20.03.2011
comment
Помечено. Спасибо, что отправили это в виде буга. Я хотел еще раз взглянуть на это, прежде чем сделать это.   -  person Kelly Merrell    schedule 23.03.2011
comment
... и ошибка исправлена. Исправление пришло слишком поздно для выпуска 3.1; это будет в следующем выпуске.   -  person Chet Haase    schedule 20.05.2011
comment
@Chet: Не могли бы вы опубликовать подробности исправления в качестве ответа, чтобы мы могли убрать это из списка неотвеченных? Спасибо.   -  person Bill the Lizard    schedule 25.06.2011
comment
Было интересно, будет ли это также исправлено в пакете совместимости с Android. Последняя версия, которую я использую (редакция 3), похоже, не содержит исправления.   -  person taf    schedule 04.08.2011


Ответы (3)


Ошибка была исправлена ​​в версии 3.2 с добавлением следующего нового API:

http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations%28int,%20int,%20int,%20int%29

Следует отметить, что он еще не был перенесен в библиотеку совместимости (как указано в отчете об ошибке).

person kajham    schedule 30.09.2011
comment
Последний выпуск библиотеки совместимости (r4) теперь содержит это исправление. - person blazeroni; 22.10.2011
comment
Я использую последнюю версию библиотеки совместимости, но всякий раз, когда я пытаюсь вызвать это, я получаю исключение Unknown animation name: objectAnimator. - person powerj1984; 12.12.2011
comment
С поддержкой вы можете использовать только анимацию в xml, старый способ, но не объектный аниматор. - person Snicolas; 06.03.2013

Я использую это:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out);

и переходы работают в обратном порядке при нажатии кнопки возврата.

person Community    schedule 08.06.2012
comment
Вы, сэр, бог среди людей. - person Cruceo; 11.01.2014
comment
это было легкое решение - person Hamzeh Soboh; 02.03.2015

Это ошибка, посмотрите на отчет об ошибке 15623. Один из участников проекта Android прокомментировал, что исправление было слишком поздно для выпуска 3.1, но оно должно появиться в следующем выпуске.

Тот же участник продолжает, что ...

Проблема в том, что в операции pop запускаются те же самые анимации, что и для размещения фрагментов на их текущих местах. Например, в приведенном выше примере скольжения при операции вперед (помещая старый фрагмент в стек и перемещая новый фрагмент в поле зрения), мы выдвигаем старый фрагмент из центра влево и вставляем новый фрагмент из прямо в центр. Когда стек выталкивается, запускаются те же самые анимации: самый последний фрагмент анимируется «наружу», сдвигая его вправо в центр (после чего он исчезает, поскольку удаляется). Старый фрагмент выскакивает из стека и анимируется из центра влево ... прямо за пределы экрана.

person Gallal    schedule 06.07.2011