Android片段动画onResume

时间:2013-01-18 08:10:05

标签: android android-fragments android-animation android-nested-fragment

情况如下:

我正在使用API​​ 17引入的子片段。说我有

ActivityA -> FragmentA
ActivityA -> FragmentB

FragmentA -> ChildFragmentA
FragmentA -> ChildFragmentB

所以我在ActivityA->FragmentA->ChildFragmentA上,我使用FragmentTransaction转换到ActivityA->FragmentA->ChildFragmentB,使用动画添加到backstack并弹出backstack(当我转到ChildFragmentB时会有动画,当动画时会有动画我按下然后转到ChildFragmentA)。

现在我导航到ActivityA->FragmentB(FragmentA不再附加)。当我导航回ActivityA->FragmentA可见ChildFragmentB时,ChildFragmentB会像来自ChildFragmentA时那样进行动画制作。

我想在恢复Activity->FragmentA时禁用此动画。但是在儿童片段之间转换时要保持它。此动画在FragmentTransaction中设置。有没有办法让这种情况发生?

2 个答案:

答案 0 :(得分:3)

我通过向父片段添加一些逻辑来检测它,以检测它何时被隐藏或显示,并明确禁用或启用其子代中的动画。

@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" />

答案 1 :(得分:0)

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