У меня есть RecyclerView внутри CoordinatorLayout вместе с FAB:
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/empty"
android:visibility="invisible"
android:textSize="@dimen/title"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/margin"
android:src="@drawable/add"
android:layout_gravity="bottom|right"
app:fabSize="normal"
app:tint="@android:color/white" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
При прикреплении поведения к FAB вот так:
(fab.layoutParams as CoordinatorLayout.LayoutParams).behavior = ScrollAwareFABBehavior()
Затем first click Событие не отправляется в представления элементов. Слушатели щелчка (ViewHolder.itemView.setOnClickListener()
), когда FAB скрыт. Вот реализация поведения:
class ScrollAwareFABBehavior : FloatingActionButton.Behavior() {
override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
return axes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type)
}
override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, type: Int, consumed: IntArray) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed)
if (dyConsumed > 0) {
child.hide(object : OnVisibilityChangedListener() {
override fun onHidden(fab: FloatingActionButton) {
super.onHidden(fab)
fab.visibility = View.INVISIBLE
}
})
} else if (dyConsumed < 0) {
child.show()
}
}
}
вызывается OnStartNestedScroll, но не слушатель щелчка элемента, если я действительно не стараюсь не прокручивать экран с 1px при щелчке элемента вторичной переработки.
Все работает как положено, когда:
- удаление поведения из FAB
- удаление OnVisibilityChangedListener из реализации поведения
- или удаление только
fab.visibility = View.INVISIBLE
из поведения impl
Но без fab.visibility = View.INVISIBLE
FAB больше не появляется после того, как был скрыт FabBehaviour ( FAB Скрывает, но не показывает ) ...
Если кто-то может помочь мне показать / скрыть FAB с использованием поведения и не иметь первого клика, не доставленного на просмотр предмета, было бы здорово!