如何在Android Lollipop中推迟片段的进入转换?

时间:2014-11-17 16:32:46

标签: android android-5.0-lollipop shared-element-transition activity-transition fragment-transitions

在Android Lollipop中,Activity#postponeEnterTransition()Activity#startPostponedEnterTransition()方法使Activity能够延迟开始进入和退出共享元素转换,直到加载所有数据。这些适用于Activity过渡。

使用Fragment过渡时有没有办法达到同样的效果?

2 个答案:

答案 0 :(得分:12)

片段转换中没有直接的等价物,因为片段使用FragmentTransaction,我们无法真正推迟应该在事务中发生的事情。

要获得等效物,您可以添加片段并将其隐藏在事务中,然后当片段准备就绪时,删除旧片段并在事务中显示新片段。

getFragmentManager().beginTransaction()
    .add(R.id.container, fragment2)
    .hide(fragment2)
    .commit();

稍后,当fragment2准备就绪时:

getFragmentManager().beginTransaction()
    .addSharedElement(sharedElement, "name")
    .remove(fragment1)
    .show(fragment2)
    .commit();

答案 1 :(得分:1)

您可以通过执行以下操作来推迟Fragment的输入转换:

  • 允许FragmentTransaction重新排序并优化交易

    requireActivity().supportFragmentManager
      .beginTransaction()
      .replace(R.id.container, fragmentB)
      .addSharedElement(view, "transitionName")
      .setReorderingAllowed(true) // Set to true
      .commit()
    
  • 告诉fragmentB在创建视图后延迟过渡

    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's blog