【问题标题】:Make replaced fragment visible while transition ongoing在过渡进行时使替换的片段可见
【发布时间】:2019-06-25 13:54:33
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我明白了。但很难告诉客户我将使用淡入淡出而不是移动过渡)。所以我需要为这个功能找到不同的方法。
    • 不幸的是,这是片段转换的限制:/ 您仍然可以根据需要保留共享元素转换,但据我所知,无需任何Visibility 转换即可将片段的其他元素保持在适当的位置是不可能的。
    • 我刚刚找到了解决方案。这真的是可能的。我会发布答案,所以你可以检查如何实现这一点。
    【解决方案2】:

    我不知道导航是否真的可行。 但是基本的 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,持续时间长(1000ms)

    .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
    

    所以很明显,当事务正在进行时,第一个片段仍然可见。这是一种解决方法,但有效)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多