14

情况如下:

我正在使用 API 17 引入的子片段。假设我有

ActivityA -> FragmentA
ActivityA -> FragmentB

FragmentA -> ChildFragmentA
FragmentA -> ChildFragmentB

所以我开始使用 FragmentTransactionActivityA->FragmentA->ChildFragmentA过渡到ActivityA->FragmentA->ChildFragmentB使用动画添加到后台堆栈和弹出后台堆栈(当我转到 ChildFragmentB 时有一个动画,当我按下并移到 ChildFragmentA 时有一个动画)。

现在我导航到ActivityA->FragmentB(不再附加 FragmentA)。当我导航回可见的ActivityA->FragmentA位置时,会像来自. ChildFragmentBChildFragmentBChildFragmentA

我想在恢复时禁用此动画Activity->FragmentA。但是在子片段之间转换时保留它。这个动画是在 FragmentTransaction 中设置的。有没有办法做到这一点?

4

2 回答 2

4

I solved this by adding some logic to the parent fragment to detect when it is being hidden or shown, and explicitly disable or enable animations in its child.

@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();
    }
}

In the child fragment, we need to implement those methods to enable/disable animations. We do this by overriding onCreateAnimation() and using a static animation (R.anim.hold) in the case where animations should be disabled.

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

The static animation is defined in res/anim/hold.xml as:

<?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" />
于 2014-05-12T08:27:40.397 回答
0

尝试在 ActivityA->FragmentA 中禁用转换 onAttach 并在 FragmentA 和 B 的 ChildFragments 中再次启用 onResume

于 2014-05-12T08:02:10.923 回答