片段popbackstack动画不起作用

时间:2017-09-29 15:24:21

标签: android android-fragments android-animation

我想在打开和关闭时为片段设置动画。我有淡入淡出和淡出自定义动画XML文件。

我在支持FragmentTransaction时使用了setCustomAnimations,但是当我执行addToBackStack时它所做的就是动画,当我执行popBackStack时它只会在没有动画的情况下消失。

这是我的代码片段:

private void fragmentAppear(){
    fragment = new LoginFragment();
    fragmentManager = LoginActivity.this.getSupportFragmentManager();
    fragmentTransaction = fragmentManager.beginTransaction();
    //my XML anim files
    fragmentTransaction.setCustomAnimations(R.anim.slide_in_bottom,0,0,R.anim.slide_out_bottom);
    fragmentTransaction.replace(R.id.login_fragment, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

private void fragmentDisappear(){
    getSupportFragmentManager().popBackStack();
}

在setCustomAnimations部分,我使用了4个参数,到目前为止它只显示了在我调用fragmentAppear时幻灯片放入之前的淡出动画,但是在调用fragmentDisappear时只显示从不。我已经尝试过许多不同的方式对参数进行排序,我也尝试过使用setCustomAnimations的两个param版本,当片段出现时它所做的就是动画。

我使用android.support.v4.app库为我的片段。

编辑:此外,动画在按下后退按钮时不会显示,也不会调用fragmentDisappear。

过去的代码在活动中,我试图从片段中做一个popBackStack,它也没有工作。这是关闭我片段的正确方法吗?

编辑:我将包含XML动画:

  

slide_in_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromYDelta="75%p"
        android:toYDelta="0%p"
        android:fillAfter="true"
        android:duration="400" />
</set>
  

slide_out_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromYDelta="0%p"
        android:toYDelta="75%p"
        android:fillAfter="true"
        android:duration="400" />
</set>

2 个答案:

答案 0 :(得分:2)

如果你看一下你要用新片段替换片段的代码,但你实际上是设置add to back stack null。为每个片段提供标记是一种很好的做法,它甚至可以很容易地通过标记找到该片段。像下面一样为您的片段添加标签。如果它仍然无法工作,则问题将出现在动画xml文件中。

private void fragmentAppear(){
   fragment = new LoginFragment();
   fragmentManager = LoginActivity.this.getSupportFragmentManager();
   fragmentTransaction = fragmentManager.beginTransaction();
   //my XML anim files
   fragmentTransaction.setCustomAnimations(
        R.anim.slide_in_bottom,0,0,R.anim.slide_out_bottom);
   fragmentTransaction.replace(
        R.id.login_fragment, fragment, "loginFragment");
   fragmentTransaction.addToBackStack("loginFragment");
   fragmentTransaction.commit();
}

从Fragment Transaction文档中,我看到了这个函数,你必须指定适当的动画。

/**
 * 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. enter =&gt;片段输入时的动画
  2. exit =&gt;片段退出时的动画。
  3. popEnter =&gt;片段从后栈进入时的动画。
  4. popExit =&gt;当从后栈弹出时片段退出时的动画。
  5. 使用它们直到获得所需的行为。

答案 1 :(得分:0)

在我的例子中,片段容器的高度是 wrap_content 所以流行动画不起作用(而进入动画效果很好)。
将片段容器高度设置为特定高度,否则 match_parent 将使流行动画效果良好