Причина этого в том, что AppBarLayout
не прекращает бросать, когда мы начинаем бросать на любое другое представление CoordinatorLayout
. Решение довольно простое: всякий раз, когда любой дочерний вид CoordinatorLayout
начинает сбрасывать, нам нужно остановить сброс AppBarLayout
(код ниже для androidx)
class CustomAppBarBehavior : AppBarLayout.Behavior() {
private var overScroller: OverScroller? = null
override fun onNestedPreFling(coordinatorLayout: CoordinatorLayout,
child: AppBarLayout,
target: View,
velocityX: Float,
velocityY: Float): Boolean {
stopAppBarLayoutFling()
return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY)
}
private fun stopAppBarLayoutFling() {
if (overScroller == null) {
val scrollerField = javaClass.superclass.superclass.superclass.getDeclaredField("scroller")
scrollerField.isAccessible = true
overScroller = scrollerField.get(this) as? OverScroller
}
overScroller?.forceFinished(true)
}
}
В версии поддержки 27 поиск скроллера с помощью отражения немного отличается:
val scrollerField = javaClass.superclass.superclass.getDeclaredField("mScroller")