谷歌推荐升级到ViewPager2,我其实是比较关注他的懒加载功能。可是到了项目后期我们反而需要同时加载多个Fragment了。但这与这篇文章无关。
先说说冲突的背景。我们是在ViewPager2中的Fragment使用了SwipeRefreshLayout。当向下滑动时只要稍微偏左或右都会触发ViewPager2的移动,造成SwipeRefreshLayout卡在页面上不消失。
我们首先准备修改ViewPager2,可是它没法继承。那么目光只好投向SwipeRefreshLayout。
class MySwipeRefreshLayout : SwipeRefreshLayout {
constructor(context: Context, attes: AttributeSet) : super(context, attes) {}
constructor(context: Context) : super(context)
private var startX = 0
private var beginScrolll = false //是否开始滑动
private var startY: Int = 0
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
when (ev.action) {
MotionEvent.ACTION_DOWN -> {
startX = ev.x.toInt()
startY = ev.y.toInt()
parent.requestDisallowInterceptTouchEvent(true)
}
MotionEvent.ACTION_MOVE -> {
val endX = ev.x.toInt()
val endY = ev.y.toInt()
val disX = Math.abs(endX - startX)
val disY: Int = Math.abs(endY - startY)
if (disX > disY) {
if (!beginScrolll)
parent.requestDisallowInterceptTouchEvent(false)
} else {
beginScrolll = true
parent.requestDisallowInterceptTouchEvent(true)
}
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
parent.requestDisallowInterceptTouchEvent(false)
beginScrolll=false
}
}
return super.dispatchTouchEvent(ev)
}
}
xml中用这个MySwipeRefreshLayout就Ok了!