Как отложить входной переход Фрагмента в Android Lollipop?

В Android Lollipop, Activity#postponeEnterTransition() а также Activity#startPostponedEnterTransition() Методы дают Activity возможность отложить запуск входных и выходных переходов совместно используемых элементов до тех пор, пока не будут загружены все данные. Они отлично работают для Activity переходы.

Есть ли способ добиться того же эффекта при использовании Fragment переходы?

1 ответ

Решение

В переходах фрагментов прямого эквивалента нет, поскольку фрагменты используют FragmentTransaction, и мы не можем отложить то, что должно произойти в транзакции.

Чтобы получить эквивалент, вы можете добавить фрагмент и скрыть его в транзакции, затем, когда фрагмент будет готов, удалить старый фрагмент и показать новый фрагмент в транзакции.

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

Позже, когда Frag2 готов:

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()
    
  • Скажите 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 { ... }используется для обеспечения того, чтобы виды фрагмента были измерены и разложены для перехода. См . Блог Криса Бэйнса для получения более подробной информации.