Конфликт Z-индекса при анимации перехода фрагмента с помощью компонента Android Navigation

Я пытаюсь использовать Android-навигация вместо транзакции фрагмента. Однако есть одна проблема, которая становится громоздкой. При использовании вставной анимации для Enter Animation новый фрагмент располагается под текущим фрагментом. Не забудьте посмотреть следующее видео, чтобы увидеть ошибку в действии. https://thewikihow.com/video_gFnXiEyiypM

Ошибка, похоже, не связана с компонентом Navigation, хотя хакерские решения (это и это), которые были введены для этой конкретной проблемы, похоже, не исправляют ее при использовании Navigation. Нет ли обходного пути для этого, пока не будет выпущено официальное исправление?

4
0
762
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

К сожалению, эта проблема еще не решена Google. Об этом сообщалось здесь: https://issuetracker.google.com/issues/79443865

Мне сложно понять, как такая компания, как Google, не может предоставить что-то, что они говорят нам делать в своих Правилах использования материалов.

На самом деле есть это исправление, которое я собираюсь опубликовать в качестве ответа.

2hamed 08.01.2019 07:58
Ответ принят как подходящий

Для этой проблемы существует хакерское решение, пока 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
        }
    }
}

Спасибо, я попробую :)

Jeremi 09.01.2019 09:48

Это работает для меня. Жду официального исправления Google. Выпуск фрагмента 1.2.0-rc2 все еще не исправляет эту проблему.

marcouberti 27.11.2019 17:25

Другие вопросы по теме