【问题标题】:Android Fragment Animation onResumeAndroid 片段动画 onResume
【发布时间】:2014-05-12 17:52:21
【问题描述】:

情况如下:

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

ActivityA -> FragmentA
ActivityA -> FragmentB

FragmentA -> ChildFragmentA
FragmentA -> ChildFragmentB

所以我在 ActivityA->FragmentA->ChildFragmentA 上,我使用 FragmentTransaction 转换到 ActivityA->FragmentA->ChildFragmentB,使用动画添加到后台堆栈和弹出后台堆栈(当我转到 ChildFragmentB 时有一个动画,当我按下返回时有一个动画移动到 ChildFragmentA)。

现在我导航到ActivityA->FragmentB(片段A 不再附加)。当我导航回ActivityA->FragmentA 时,ChildFragmentB 是可见的,ChildFragmentB 的动画效果与来自ChildFragmentA 时一样。

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

【问题讨论】:

  • 您是否尝试过保留您来自哪个活动或片段的值并相应地设置您的片段事务?就像ft.setCustomAnimations(FragmentTransaction.TRANSIT_NONE, FragmentTransaction.TRANSIT_NONE); 一样,当您不想进行任何转换时。我不确定您在哪里指定 FragmentTransaction,所以我不知道这是否适合您。

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


【解决方案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】:

    尝试在ActivityA->FragmentA中禁用过渡onAttach,在FragmentA和B的ChildFragments中再次启用onResume

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-13
      • 2023-04-02
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2012-06-08
      相关资源
      最近更新 更多