В чем разница между входом / выходом и 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
Теперь, чтобы ответить на ваш вопрос.
Вы не говорите, если контейнер уже имеет фрагмент или нет. Давайте рассмотрим оба случая:
Контейнер уже имел фрагмент (назовем его Fragment 0), когда была вызвана первая операция для замены на Fragment A. При выталкивании всего стека:
- Фрагмент B запускает анимацию popExit (устанавливается во втором фрагменте)
- Фрагмент 0 запускает анимацию popEnter (устанавливается в первом фрагменте)
Контейнер был пуст, поэтому замена на Фрагмент А была по существу операцией добавления. При выталкивании всего стека:
- Фрагмент B запускает анимацию popExit (устанавливается во втором фрагменте)
- Анимация popEnter не запускается, так как контейнер пуст