Android Fragment Animation onResume - программирование
Подтвердить что ты не робот

Android Fragment Animation onResume

Вот ситуация:

Я использую дочерний фрагмент, введенный с API 17. Скажем, у меня

ActivityA -> FragmentA
ActivityA -> FragmentB

FragmentA -> ChildFragmentA
FragmentA -> ChildFragmentB

Итак, я нахожусь на ActivityA->FragmentA->ChildFragmentA, и я перехожу к ActivityA->FragmentA->ChildFragmentB с помощью FragmentTransaction, используя анимацию для добавления в backstack и popping backstack (есть анимация, когда я перехожу к ChildFragmentB и анимации, когда я отжимаю и перейдите в ChildFragmentA).

Теперь я перехожу к ActivityA->FragmentB (FragmentA уже не привязан). Когда я вернусь назад к ActivityA->FragmentA, где отображается ChildFragmentB, ChildFragmentB анимируется, как и при использовании ChildFragmentA.

Я хочу отключить эту анимацию при возобновлении Activity->FragmentA. Но держите его при переходе между фрагментами детей. Эта анимация устанавливается в FragmentTransaction. Есть ли способ сделать это?

4b9b3361

Ответ 1

Я решил это, добавив некоторую логику в родительский фрагмент, чтобы обнаружить, когда он скрыт или показан, и явно отключить или включить анимацию в своем дочернем элементе.

@Override
public void onPause() {
    super.onPause();
    // If this fragment is being closed/replaced then disable animations 
    // in child fragments. Otherwise we get very nasty visual effects 
    // with the parent and child animations running simultaneously
    ChildFragment f = (ChildFragment) getChildFragmentManager()
                                        .findFragmentByTag(FRAGMENT_CHILD);
    if (f != null) {
        f.disableAnimations();
    }
}

@Override
public void onResume() {
    super.onResume();
    // if this fragment is being opened then re-enable animations 
    // in child fragments
    ChildFragment f = (ChildFragment) getChildFragmentManager()
                                        .findFragmentByTag(FRAGMENT_CHILD);
    if (f != null) {
        f.enableAnimations();
    }
}

В дочернем фрагменте нам нужно реализовать эти методы для включения/отключения анимации. Мы делаем это путем переопределения onCreateAnimation() и использования статической анимации (R.anim.hold) в случае, когда анимация должна быть отключена.

private boolean mDisableAnimations;

void disableAnimations() {
    mDisableAnimations = true;
}

void enableAnimations() {
    mDisableAnimations = false;
}

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    if (mDisableAnimations) {
        return AnimationUtils.loadAnimation(getActivity(), R.anim.hold);
    }
    return super.onCreateAnimation(transit, enter, nextAnim);
}

Статическая анимация определяется в res/anim/hold.xml как:

<?xml version="1.0" encoding="utf-8"?>
<translate
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:fromXDelta="0"
  android:toXDelta="0"
  android:duration="2000" />

Ответ 2

Попробуйте отключить переход onAttach в ActivityA- > FragmentA и снова включить его снова в разделе "Ребенка" в фрагментах FragmentA и B