В чем разница между входом / выходом и popEnter/popExit, и какая анимация транзакции будет выполняться в стеке pop

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

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

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);

1 ответ

Решение

Давайте начнем с простого случая:

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

  • Фрагмент Б работает в анимации
  • Фрагмент А запускает анимацию выхода

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

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

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

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

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

    • Фрагмент B запускает анимацию popExit (устанавливается во втором фрагменте)
    • Фрагмент 0 запускает анимацию popEnter (устанавливается в первом фрагменте)
  2. Контейнер был пуст, поэтому замена на Фрагмент А была по существу операцией добавления. При выталкивании всего стека:

    • Фрагмент B запускает анимацию popExit (устанавливается во втором фрагменте)
    • Анимация popEnter не запускается, так как контейнер пуст
Другие вопросы по тегам