54

我在使用或理解从后台堆栈弹出 FragmentTransactions 如何处理自定义动画时遇到问题。具体来说,我希望它调用“out”动画,但似乎没有。

我有一个简单的方法来处理片段事务(FragmentTransaction),我在其中添加片段并应用自定义转换,以便它淡入/淡出。我还将它添加到后退堆栈中,以便用户可以使用后退按钮撤消该事务,基本上导航到添加片段之前的状态。

protected void changeFragment() { 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    ft.add(R.id.fragment_container, new TestFragment()); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

一切都很好,但是当用户单击后退按钮时,过渡动画不会反转。我所期望的是,当片段被移除时,它会使用淡出动画。相反,它似乎弹出(没有动画),然后容器似乎淡入。我不确定这正是正在发生的事情,但片段绝对没有淡出。

我的应用程序使用兼容性库来添加片段支持,但我认为这也适用于 Honeycomb (android-11)。有谁知道我只是在这里做错了什么还是我只是期待太多?理想情况下,我想为片段设置动画,类似于 Gmail(在 Xoom 上)通过单击消息向前移动然后使用返回按钮返回的方式。最好不必覆盖后退按钮功能并跟上我自己的片段状态,因为我可能有几个我想退出的“事务”,而且我不喜欢重新发明轮子。

还询问了 Android 开发者组:http ://groups.google.com/group/android-developers/browse_thread/thread/1136a3a70fa0b6e9

4

3 回答 3

50

我用这个:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out);

当按下后退按钮时,转换会反向工作。

于 2012-06-08T16:13:30.267 回答
29

该错误已在 3.2 版本中修复,并添加了以下新 api:

http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int)

需要注意的是,它还没有被向后移植到兼容性库(如错误报告中所述)。

于 2011-09-30T20:20:13.680 回答
5

这是一个错误,请查看错误报告 15623。一位 Android 项目成员评论说,该修复对于 3.1 版来说为时已晚,但它应该会在下一个版本中使用。

同一个成员接着说……

问题是在弹出操作上运行的动画与将片段放在当前位置时运行的动画相同。例如,在上面的滑动示例中,在前向操作中(将旧片段推入堆栈并将新片段移动到视图中),我们将旧片段从中心滑出到左侧,并将新片段从中心滑入到中心。当堆栈被弹出时,这些相同的动画会运行:最近的片段通过从右侧滑入到中心被动画“移出”(之后它会消失,因为它正在被移除)。旧片段从堆栈中弹出,并从中心向左移动......就在屏幕外。

于 2011-07-06T19:43:00.137 回答