Я пытаюсь использовать Android-навигация вместо транзакции фрагмента. Однако есть одна проблема, которая становится громоздкой. При использовании вставной анимации для Enter Animation новый фрагмент располагается под текущим фрагментом. Не забудьте посмотреть следующее видео, чтобы увидеть ошибку в действии.
https://thewikihow.com/video_gFnXiEyiypM
Ошибка, похоже, не связана с компонентом Navigation, хотя хакерские решения (это и это), которые были введены для этой конкретной проблемы, похоже, не исправляют ее при использовании Navigation.
Нет ли обходного пути для этого, пока не будет выпущено официальное исправление?
К сожалению, эта проблема еще не решена Google. Об этом сообщалось здесь: https://issuetracker.google.com/issues/79443865
Мне сложно понять, как такая компания, как Google, не может предоставить что-то, что они говорят нам делать в своих Правилах использования материалов.
Для этой проблемы существует хакерское решение, пока 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
}
}
}
Спасибо, я попробую :)
Это работает для меня. Жду официального исправления Google. Выпуск фрагмента 1.2.0-rc2 все еще не исправляет эту проблему.
На самом деле есть это исправление, которое я собираюсь опубликовать в качестве ответа.