Сделать замененный фрагмент видимым во время перехода - PullRequest
0 голосов
/ 25 июня 2019

Я использую компонент архитектуры навигации, и я получил общий переход между двумя фрагментами, работающий нормально.Первый фрагмент содержит обзор переработчика, а второй - «подробности» элемента просмотра переработчика.Проблема в том, что мне нужно, чтобы первый фрагмент оставался видимым во время перехода.

Как мне сделать такой переход?Есть ли возможность достичь этого с помощью компонента Navigation Architecture?Если нет, что мне нужно использовать?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Способ работы выходных переходов заключается в добавлении целевых представлений в ViewOverlay , который добавляется к входящему фрагменту.Это означает, что после замены фрагмента существует только входящий фрагмент, и все переходы, применяемые к выходящим представлениям, фактически выполняются в представлениях, добавленных к входному фрагменту ViewOverlay .

Причина, по которой ваш выходящий фрагмент не остается видимым, заключается в том, что у вас нет переходного выхода, что означает, что никакие представления не добавляются к ViewOverlay входящего фрагмента.

Каждый вид, который являетсяtarget в выходном переходе добавляется к ViewOverlay, который находится поверх иерархии представления входящих фрагментов.Таким образом, просто оставить исходный фрагмент, пока происходит переход, невозможно, потому что, как только вы нацеливаетесь на любые представления выходного фрагмента, это приведет к тому, что они окажутся на вершине иерархии представлений, таким образом скрывая все другие представления (включая общий элемент).

Лучше всего использовать переход Fade в качестве выходного перехода, и таким образом вы можете создать перекрестное затухание между фрагментами

0 голосов
/ 26 июня 2019

Я не знаю, возможно ли это с навигацией. Но это действительно возможно с базовой FragmentTransaction

 fragmentManager!!
                    .beginTransaction()
                    .setReorderingAllowed(true) // setAllowOptimization before 26.1.0
                    .addSharedElement(view.imageIV, "fragment_news_iv")
                    .addSharedElement(view.title, "fragment_news_title_tv")
                    .addSharedElement(view.date, "fragment_news_date_tv")
                    .addSharedElement(view.container, "fragment_news_scrollView")
                    .addSharedElement(view.description, "fragment_news_description_tv")
                    .addToBackStack(null)
                    .setCustomAnimations(
                        android.R.anim.fade_in,
                        android.R.anim.fade_out,
                        android.R.anim.fade_in,
                        android.R.anim.fade_out
                    )
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .add(
                        R.id.main_host_fragment,
                        NewsDetailsFragment(),
                        NewsDetailsFragment::class.java.simpleName
                    ).addToBackStack(null)
                    .hide(this@MainFragment)
                    .commit()

Вот часть кода, которая выполняет транзакцию.

U может устанавливать пользовательские анимации, такие как fade_in, fade_out с большой продолжительностью (1000 мс)

.setCustomAnimations(
                        android.R.anim.fade_in,
                        android.R.anim.fade_out,
                        android.R.anim.fade_in,
                        android.R.anim.fade_out
                    )

и установить sharedEnterTransition в деталях фрагмента с длительностью 200

  val trans = TransitionInflater.from(context).inflateTransition(android.R.transition.move)
    trans.apply {
        duration = 200
        enterTransition = trans
    }

    sharedElementEnterTransition = trans

Таким образом, очевидно, что первый фрагмент все еще будет виден во время выполнения транзакции. Это своего рода обходное решение, но работает)

...