В чем разница между анимацией входа/выхода и popEnter/popExit?

В setCustomAnimations() для анимации требуется четыре идентификатора ресурса. Не очень понимаю их. Если у кого-то есть более четкое представление об этом, было бы признательно, если бы вы могли объяснить.

Скажем, добавление фрагмента A в заполнитель и обратно.

FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.holder, fragA, FragmentA.FRAGMENT_NAME);
        ft.addToBackStack(FragmentA.FRAGMENT_NAME);
        ft.setCustomAnimations(R.anim.slide_in_from_bottom, R.anim.slide_in_from_top, R.anim.slide_in_from_left, R.anim.slide_in_from_right);
        ft.show(frag);
        ft.commit();

И заменить на фрагмент B:

FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.holder, fragB, FragmentB.FRAGMENT_NAME);
        ft.addToBackStack(FragmentB.FRAGMENT_NAME);
        ft.setCustomAnimations(R.anim.slide_in_from_bottom, R.anim.slide_in_from_top, R.anim.slide_in_from_left, R.anim.slide_in_from_right);
        ft.show(frag);
        ft.commit();

в следующий раз, если сделать popstack()

fm.popBackStackImmediate(FragmentB.FRAGMENT_NAME,
                                FragmentManager.POP_BACK_STACK_INCLUSIVE);

Анимация какой транзакции будет запущена?

/**
 * Set specific animation resources to run for the fragments that are
 * entering and exiting in this transaction. The <code>popEnter</code>
 * and <code>popExit</code> animations will be played for enter/exit
 * operations specifically when popping the back stack.
 */
public abstract FragmentTransaction setCustomAnimations(@AnimRes int enter,
        @AnimRes int exit, @AnimRes int popEnter, @AnimRes int popExit);

person lannyf    schedule 30.11.2016    source источник


Ответы (1)


Начнем с простого случая:

Замените фрагмент A фрагментом B (ваш второй фрагмент кода)

  • Фрагмент B запускает анимацию enter
  • Фрагмент A запускает анимацию exit

Нажмите кнопку «Назад» и отмените операцию замены.

  • Фрагмент B запускает анимацию popExit
  • Фрагмент A запускает анимацию popEnter

Теперь, чтобы ответить на ваш вопрос.

Вы не говорите, есть ли в контейнере уже фрагмент или нет. Рассмотрим оба случая:

  1. В контейнере уже был фрагмент (назовем его Фрагмент 0), когда была вызвана первая операция по замене на Фрагмент А. При извлечении всего стека:

    • Fragment B runs popExit animation (set in second snippet)
    • Фрагмент 0 запускает анимацию popEnter (задается в первом фрагменте)
  2. Контейнер был пуст, поэтому замена фрагментом A была по сути операцией добавления. При извлечении всего стека:

    • Fragment B runs popExit animation (set in second snippet)
    • Анимация popEnter не запускается, так как контейнер теперь пуст
person kris larson    schedule 07.12.2016