在过渡过程中使替换片段可见

Make replaced fragment visible while transition ongoing

我使用的是导航架构组件,两个片段之间的共享元素转换工作正常。第一个片段包含 recyclerview,第二个片段是 "details" 个 recyclerview 项目。问题是我需要在转换过程中保持第一个片段可见。

我如何进行这样的转换?是否有任何选项可以通过 Navigation Architecture Component 实现这一目标?如果不是,我需要使用什么?

退出转换的工作方式是将目标视图添加到 ViewOverlay that is added to the entering fragment. This means that, once the fragment is replaced, only the entering fragment exists and all the transitions applied to views that are exiting are actually happening on views that have been added to the entering fragment's ViewOverlay

您的退出片段不可见的原因是您没有退出过渡,这意味着没有视图添加到进入片段的 ViewOverlay

退出转换中的每个目标视图都添加到位于进入片段视图层次结构顶部的 ViewOverlay。因此,在发生过渡时让退出片段只是坐在那里是不可能的,因为一旦您将退出片段的任何视图作为目标,它将导致它们位于视图层次结构的顶部,从而隐藏所有其他视图(包括共享元素) .

你最好的选择可能是使用 Fade 过渡作为退出过渡,这样你就可以在片段之间创建淡入淡出

我不知道导航是否真的可行。 但它真的有可能使用基本的 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()

这是进行交易的部分代码。

您可以设置自定义动画,例如 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
                    )

并在 detailsFragment 中设置 sharedEnterTransition 持续时间为 200

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

    sharedElementEnterTransition = trans

很明显,第一个片段在交易进行时仍然可见。这是一种变通解决方案,但有效)