使用Android导航组件为片段过渡设置动画时,Z索引冲突

时间:2018-07-14 11:12:32

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

我正在尝试使用Android Navigation而不是片段事务。然而,有一个问题开始变得麻烦。在Enter Animation中使用滑入式动画时,新片段将位于当前片段下方。请务必观看以下视频以查看实际的错误。
https://youtu.be/gFnXiEyiypM

尽管针对此特定问题引入的hacky解决方案(thisthis)似乎无法修复该错误,但该错误似乎并非来自Navigation组件使用了Navigation
在正式修复程序发布之前,没有解决方法吗?

2 个答案:

答案 0 :(得分:0)

很遗憾,Google尚未解决此问题。据报道:https://issuetracker.google.com/issues/79443865

我很难理解像Google这样的公司如何无法提供他们在材料指南中要求我们做的事情。

答案 1 :(得分:0)

在Google发布正式的修复程序之前,该问题已得到修复。解决方案是使用以下代码覆盖onCreateAnimation

class BaseFragment : Fragment() {

    override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {
        if (nextAnim == R.anim.fragment_enter) {
            val nextAnimation = AnimationUtils.loadAnimation(context, nextAnim)
            nextAnimation.setAnimationListener(object : Animation.AnimationListener {
                private var startZ = 0f
                override fun onAnimationStart(animation: Animation) {
                    view?.apply {
                        startZ = ViewCompat.getTranslationZ(this)
                        ViewCompat.setTranslationZ(this, 10f)
                    }
                }

                override fun onAnimationEnd(animation: Animation) {
                    // Short delay required to prevent flicker since other Fragment wasn't removed just yet.
                    view?.apply {
                        this.postDelayed({ ViewCompat.setTranslationZ(this, startZ) }, 100)
                    }
                }

                override fun onAnimationRepeat(animation: Animation) {}
            })
            return nextAnimation
        } else {
            return null
        }
    }
}