【问题标题】:CustomAnimations on FragmentTransaction not working for the old fragmentFragmentTransaction 上的 CustomAnimations 不适用于旧片段
【发布时间】:2014-01-03 13:27:20
【问题描述】:

我的FragmentActivity 在开头显示一个Fragment,当我按下Button 时显示第二个。直到这里,这很容易。但我在动画方面遇到了一个问题。
我添加了第二个片段:

mTChild.add(R.id.container, mFragChild).addToBackStack(null).commit();  

为了让它更“活泼”,我在添加Fragment之前声明了一个CustomAnimations,它看起来像这样:

mTChild.setCustomAnimations(R.anim.slide_in, R.anim.alpha_out, R.anim.alpha_in, R.anim.slide_out);  
mTChild.add(R.id.container, mFragChild).addToBackStack(null).commit();  

我使用了这个方法setCustomAnimations(int,int,int,int) (参数:进入,退出,popBack 进入,popBack 退出) 你可以在setCustomAnimations Documentation 上看到。只是为了了解我的(基本)动画 xml:

  1. slide_in > 新片段从右向左滑动。
  2. slide_out > back stack = 从左到右的片段幻灯片。
  3. alpha_out > 旧片段以 alpha 100 --> 0 消失。
  4. alpha_in > back stack = 旧片段以 alpha 0 --> 100 出现。

在这一步,我得到了我想要的从右侧滑入/滑出新片段,它发生在旧片段上方。但是对于通常留在后面并随着 alpha 消失/出现的旧片段的效果不会发生。

我做错了什么?因为,CustomAnimations 发生但不是针对旧片段(它没有被删除)。
感谢您的回答。

【问题讨论】:

    标签: android android-fragments android-animation android-fragmentactivity


    【解决方案1】:

    我很惭愧,我犯了一个愚蠢的错误!

    首先:

    显然我不能像以前那样做,因为旧片段留在后面。所以它不能制作out动画。

    当我问它时,我回答了我自己的问题:“旧片段(它没有删除)”......我的上帝!所以而不是:

    mTChild.add(R.id.container, mFragChild).addToBackStack(null).commit();  
    

    我应该这样做:

    // REPLACE (remove+add) and not ADD only !
    mTChild.replace(R.id.container, mFragChild).addToBackStack(null).commit();  
    

    如果我想要 out 动画。


    效果不错:

    我找到了一种优雅的方式!确实,我们的目标是保持第一个 Fragment 可见,与新的 FragmentListView)重叠,并使旧的不可见10%(用于产生阴影/欠效果)。我做错了。

    SlidingMenu 和这个答案Generate an overlay slide in and move existing Fragment to left 的启发,我创建了一个FrameLayoutadd() (这次毫无疑问) 新的Fragment左侧有一个View,带有渐变背景以制作阴影效果。
    有了这个:

    mTransaction.add(R.id.container, mChildA, null).hide(mChildA)
                .add(R.id.container2, mFrag, null).commit();  
    

    然后,当我按下我的Button 时,我会执行以下操作:

    mTChild.setCustomAnimations(R.anim.slide_in, 0, 0, R.anim.slide_out);  
    mTChild.show(mChildA).addToBackStack(null).commit();
    

    事实上,BackStack 具有滑入和反向效果,并且我在左侧用阴影覆盖了我的内容。我的Fragment 的 xml 现在是:

    <RelativeLayout
        android:layout_width="match_parent" android:layout_height="match_parent" >
    
        <View 
            android:id="@+id/shadowLeft"
            android:layout_width="50dip" android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:background="@drawable/fragment_shadow_left" />
    
        <ListView  
            android:id="@+id/list"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_toRightOf="@id/shadowLeft" />
    
    </RelativeLayout>
    

    最后,我将FrameLayout 设置为“托管”上面的这个布局,背景透明,效果很好。
    如果有人想编辑或给出更好的答案,我一直在听。希望这对搜索相同效果的人有用。

    【讨论】:

    • 完美,使用transaction.add看不到退出动画,需要改成transaction.replace
    【解决方案2】:

    您是否考虑过使用名为“replace”而不是“add”的方法来更改您的片段?

    【讨论】:

    • 是的,我看到了...我刚刚发布了我的答案...我的上帝!我该怎么做?无论如何,谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多