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

时间:2019-06-25 13:54:33

标签: android android-fragments android-architecture-components android-transitions android-architecture-navigation

我使用导航体系结构组件,我在两个片段之间的共享元素过渡正常。第一个片段包含recyclerview,第二个片段是recyclerview项目的“详细信息”。问题是我需要在过渡过程中保持第一个片段可见。

我该如何过渡?导航架构组件是否可以实现此目的?如果没有,我需要使用什么?

2 个答案:

答案 0 :(得分:1)

退出过渡的工作方式是将目标视图添加到ViewOverlay中,该ViewOverlay添加到输入片段中。这意味着,一旦替换了片段,就只有进入的片段存在,并且应用于退出的视图的所有过渡实际上都发生在已添加到进入的片段的Fade上的视图上。

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

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

您最好的选择可能是使用{{3}}过渡作为退出过渡,这样您就可以在片段之间创建交叉淡入淡出

答案 1 :(得分:0)

我不知道导航确实有可能。 但是使用基本的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可以设置长时间(1000ms)等淡入淡出,淡出淡出等自定义动画

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

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

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

    sharedElementEnterTransition = trans

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