在FragmentManager上调用popBackStack时的customAnimation

Gol*_*k84 29 android android-animation android-fragments

在我的活动中,只需按一下按钮,我就会使用自定义动画将新片段替换为当前片段,如本例所示.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_anomalie:
            Fragment contentFragment = getFragmentManager().findFragmentById(R.id.content);

            if(contentFragment instanceof AnomalieListFragment)
            {
                getFragmentManager().popBackStack();
                return true;
            }
            else
            {
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
                anomalieFragment = new AnomalieListFragment();
                ft.replace(R.id.content, anomalieFragment);
                ft.addToBackStack(null);
                ft.commit();
            }

    ...
Run Code Online (Sandbox Code Playgroud)

但是,弹回堆栈不会显示任何动画.有没有办法像使用setCustomAnimations方法一样在FragmentTransaction中指定自定义动画?

Gol*_*k84 93

在进一步阅读文档后,我发现使用签名setCustomAnimation允许在按下后退按钮或调用时播放动画getFragmentManager().popBackStack();

我像这样修改了我的代码

...
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out, android.R.animator.fade_in, android.R.animator.fade_out);
anomalieFragment = new AnomalieListFragment();
ft.replace(R.id.content, anomalieFragment);
ft.addToBackStack(null);
ft.commit();
...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢这个很棒.使此代码工作的原因是使用4参数重载调用的`setCustomAnimations`方法.2参数不会在`popBackStack`上制作动画. (10认同)
  • 注意,.setCustomAnimations需要在.replace之前. (3认同)
  • @Goldorak84 这就是解决方案。如果你点击 setCustomAnimation 属性查看源代码,你可以看到该函数看起来像 public FragmentTransaction setCustomAnimations(int Enter, int exit, int popEnter, int popExit) ----> 换句话说,他们明确指出了最后一个两个参数实际上是 pop 动画资源 (2认同)