Android Fragment Translate Animation on show,hide

时间:2016-02-19 10:10:36

标签: java android android-fragments android-animation

我有4个以上的碎片(android.support.v4.app.Fragment)。

Fragment f1, f2, f3, f4;
int F1 = 1; int F2 = 2; int F3 = 3; int F4 = 4;

protected void onCreate(Bundle savedInstanceState)
{
  //...
  f1 = new Fragment();
  f2 = new Fragment();
  f3 = new Fragment();
  f4 = new Fragment();

  getSupportFragmentManager().beginTransaction()
            .add(R.id.fl_root, f1)
            .add(R.id.fl_root, f2)
            .add(R.id.fl_root, f3)
            .add(R.id.fl_root, f4)
            .commit();

  setFragment(F1);
}
public void setFragment(int fragment)
{
  switch (fragment)
    {
        case F1:
            if (!f1.isVisible()) {
                getSupportFragmentManager().beginTransaction()
                        .setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0)
                        .show(f1)
                        .hide(f2)
                        .hide(f3)
                        .hide(f4)
                        .commit();
            }
            break;
       case F2:
            if (!f2.isVisible()) {
                getSupportFragmentManager().beginTransaction()
                        .setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0)
                        .show(f2)
                        .hide(f1)
                        .hide(f3)
                        .hide(f4)
                        .commit();
            }
            break;
      case F3:
            if (!f3.isVisible()) {
                getSupportFragmentManager().beginTransaction()
                        .setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0)
                        .show(f3)
                        .hide(f1)
                        .hide(f2)
                        .hide(f4)
                        .commit();
            }
            break;
     case F4:
            if (!f1.isVisible()) {
                getSupportFragmentManager().beginTransaction()
                        .setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0)
                        .show(f4)
                        .hide(f1)
                        .hide(f2)
                        .hide(f3)
                        .commit();
            }
            break;
}

setFragment到第一,第二等之后(1-> 2-> 3-> 4)rtol(从右向左翻译)动画效果正常,而且没关系。
但是在返回之后,使用setFragment(4-> 3-> 2-> 1),仍然有rtol个动画,而不是正确的ltor(从左到右翻译)右)。

我做错了什么,解决方案是什么?

2 个答案:

答案 0 :(得分:1)

实际上,我的项目中单个活动中有20多个碎片 我解决了这个动画问题+ OutOfMemory(因为添加和隐藏了20多个片段) 一点点代码:

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (!back)
        ft.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
    else
        ft.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);

    switch (fragment)
    {
        case F1:
            ft.replace(R.id.fl_root, new F1(), String.valueOf(F1));
            break;
        //...
    }

Slide Animation here

答案 1 :(得分:0)

setCustomAnimations 方法需要一个用于输入的动画和一个用于退出片段的动画,因此即使您返回,也会输入其中一个片段。

所以你必须看一下你来自的片段并切换动画。

编辑:

也许喜欢这个未经测试的

int lastFragment;

public void setFragment(int fragment)
{
    FragmentTransaction ft = getSupportFragmentManager.beginTransaction();
    if(fragment > lastFragment) {
        ft.setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0);
    } else {
        ft.setCustomAnimations(R.anim.ltor, R.anim.rtol, 0, 0);
    }

  switch (fragment)
    {
        case F1:
            if (!f1.isVisible()) {
                        ft
                        .show(f1)
                        .hide(f2)
                        .hide(f3)
                        .hide(f4)
                        .commit();
            }
            break;
       case F2:
            if (!f2.isVisible()) {
                        ft
                        .show(f2)
                        .hide(f1)
                        .hide(f3)
                        .hide(f4)
                        .commit();
            }
            break;
      case F3:
            if (!f3.isVisible()) {
                        ft
                        .show(f3)
                        .hide(f1)
                        .hide(f2)
                        .hide(f4)
                        .commit();
            }
            break;
     case F4:
            if (!f1.isVisible()) {
                        ft
                        .show(f4)
                        .hide(f1)
                        .hide(f2)
                        .hide(f3)
                        .commit();
            }
            break;

            lastFragment = fragment;
}