【发布时间】:2013-05-16 00:10:33
【问题描述】:
场景如下:Activity 包含片段A,而后者又使用getChildFragmentManager() 在其onCreate 中添加片段A1 和A2,如下所示:
getChildFragmentManager()
.beginTransaction()
.replace(R.id.fragmentOneHolder, new FragmentA1())
.replace(R.id.fragmentTwoHolder, new FragmentA2())
.commit()
到目前为止,一切都很好,一切都按预期运行。
然后我们在Activity中运行如下事务:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(anim1, anim2, anim1, anim2)
.replace(R.id.fragmentHolder, new FragmentB())
.addToBackStack(null)
.commit()
在过渡期间,片段 B 的 enter 动画运行正常,但片段 A1 和 A2 完全消失。当我们使用返回按钮恢复事务时,它们会正确初始化并在popEnter 动画期间正常显示。
在我的简短测试中,它变得更奇怪了 - 如果我为子片段设置动画(见下文),当我们添加片段 B 时,exit 动画会间歇性地运行
getChildFragmentManager()
.beginTransaction()
.setCustomAnimations(enter, exit)
.replace(R.id.fragmentOneHolder, new FragmentA1())
.replace(R.id.fragmentTwoHolder, new FragmentA2())
.commit()
我想要实现的效果很简单 - 我想要片段 A (anim2) 上的 exit(或者应该是 popExit?)动画运行,为整个容器设置动画,包括它的嵌套子项。
有什么方法可以实现吗?
编辑:请找一个测试用例here
Edit2:感谢@StevenByle 推动我继续尝试静态动画。显然你可以在每个操作的基础上设置动画(不是全局的整个事务),这意味着孩子可以有一个无限的静态动画集,而他们的父母可以有不同的动画,整个事情可以在一个事务中提交.请参阅下面的讨论和updated test case project。
【问题讨论】:
-
对于 A、A1、A2 等,
R.id.fragmentHolder是什么? -
fragmentHolder 是 Activity 布局中的 id,fragment{One,Two}Holder 在 Fragment A 的布局中。这三个都是不同的。 Fragment A 最初是在 fragmentHolder 中添加的(即 Fragment B 正在替换 Fragment A)。
-
我在这里创建了一个示例项目:github.com/BurntBrunch/NestedFragmentsAnimationsTest,存储库中还包含一个 apk。这是一个非常烦人的错误,我正在寻找一种解决方法(假设它不在我的代码中)。
-
我现在对这个问题有了更多的了解。片段消失的原因是子级在父级之前处理生命周期事件。本质上,A1 和 A2 在 A 之前被移除,并且由于它们没有设置动画,它们会突然消失。一种缓解这种情况的方法是在替换 A 的事务中显式删除 A1 和 A2。这样,它们在退出时会进行动画处理,但是它们的动画速度是平方的,因为父容器也在进行动画处理。不产生这种人工制品的解决方案将不胜感激。
-
您在问题中提到的更改(替换起始片段)是您真正想要做的还是只是一个例子?你只会调用一次
changeFragment方法吗?
标签: android android-fragments android-support-library android-nested-fragment