界面布局大概描述一下,就是常见的四大金刚主页中某个 fragment 需要一个横向滚动的工具栏,那么很容易出现焦点抢占问题,这倒不是什么新问题,网上大把答案,不过一直没记录,记录一下:
class NestedRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : RecyclerView(context, attrs) { var intercept: (() -> Boolean)? = null override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { val canScrollHorizontally = canScrollHorizontally(-1) || canScrollHorizontally(1) val canScrollVertically = canScrollVertically(-1) || canScrollVertically(1) if (canScrollHorizontally || canScrollVertically || intercept?.invoke() == true) { this.parent?.requestDisallowInterceptTouchEvent(true) } else { this.parent?.requestDisallowInterceptTouchEvent(false) } return super.dispatchTouchEvent(ev) } }
随便取的一个名字,自行实现 intercept 闭包做自己的业务判断。
这里有一个误区值得说一下:之前我以为 requestDisallowInterceptTouchEvent 仅对上一层 parent 有效,但看源码会发现,实际上会按 View 的事件分发一样,不断的回调上层 View 的 requestDisallowInterceptTouchEvent。所以不论是 ViewPager 中套了 Fragment ,再 Fragment 中套 RecyclerView 或者中间再多套几层,实际上都是一样的。
顺便提一嘴:就如今而言,Jetpack Compose 挺香的,或许未来有一天这些都会成为过去式,事件分发机制这些记了忘,忘了记的东西有没有意义呢?
我想说,现在还没到那个时候,面试依旧需要,但真到那时候,自然也就不需要了。没落的东西安心的随时代落幕吧,就像以前没学过 RxJava 的在用了协程之后现在学不学也就不重要了~
以上!
本站由以下主机服务商提供服务支持:
0条评论