在 Android Lollipop 中,Activity#postponeEnterTransition()
和 Activity#startPostponedEnterTransition()
方法使 Activity 能够延迟启动进入和退出共享元素转换,直到加载所有数据。这些非常适合Activity
过渡。
有没有办法在使用Fragment
过渡时达到相同的效果?
Transitions 中没有直接的等价物,因为 Fragments 使用 FragmentTransaction,我们不能真正推迟事务中应该发生的事情。
要获得等效项,您可以添加一个片段并将其隐藏在事务中,然后在片段准备就绪时,删除旧片段并在事务中显示新片段。
getFragmentManager().beginTransaction()
.add(R.id.container, fragment2)
.hide(fragment2)
.commit();
稍后,当片段 2 准备就绪时:
getFragmentManager().beginTransaction()
.addSharedElement(sharedElement, "name")
.remove(fragment1)
.show(fragment2)
.commit();
您可以通过执行以下操作来推迟片段的进入过渡:
-
允许
FragmentTransaction
重新排序和优化交易requireActivity().supportFragmentManager .beginTransaction() .replace(R.id.container, fragmentB) .addSharedElement(view, "transitionName") .setReorderingAllowed(true) // Set to true .commit()
-
告诉片段 B 在视图创建后延迟过渡
class TransitionToFragment : Fragment(R.layout.fragment_b) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) postponeEnterTransition() // Don't start enter transitions yet! ... // Setup your views (view.parent as? View)?.doOnPreDraw { startPostponedEnterTransition() } // Ok, start transitions } }
view.parent.doOnPreDraw { ... }
用于确保为过渡测量和布局片段的视图。有关更多详细信息,请参阅Chris Banes的博客。