我有一个ViewPager,在SwipeRefreshLayout中包含三个片段。我看到的问题是,当尝试在ViewPager中的片段之间滑动时,有时SwipeRefreshLayout将接管并停止与ViewPager的交互。如果ViewPager交互的手势即使是一点点都垂直,则似乎是这样做的。
答案 0 :(得分:0)
我在StackOverflow上发现了一些与我的问题有些相似的问题,但都没有一个完全适合。这是我的解决方法。
自定义SwipeRefreshLayout,可以切换其InterceptTouchEvent
:
class ToggleableSwipeRefreshLayout : SwipeRefreshLayout {
private var isDisabled = false
private var touchSlop = ViewConfiguration.get(context).scaledTouchSlop
private var prevX = 0f
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
fun setDisabled(isDisabled: Boolean) {
this.isDisabled = isDisabled
parent.requestDisallowInterceptTouchEvent(isDisabled)
}
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
when (ev.action) {
MotionEvent.ACTION_DOWN -> {
val event = MotionEvent.obtain(ev)
prevX = event.x
event.recycle()
}
MotionEvent.ACTION_MOVE -> {
if (isDisabled) { return false }
val eventX = ev.x
val xDiff = Math.abs(eventX - prevX)
if (xDiff > touchSlop) {
return false
}
}
}
return super.onInterceptTouchEvent(ev)
}
}
在其中使用的“片段/活动”中,向ViewPager中添加OnPageChangeListener
以监视滚动状态并相应地启用/禁用SwipeRefreshLayout的InterceptTouchEvent
:
viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
when (state) {
ViewPager.SCROLL_STATE_DRAGGING -> swipeLayout.setDisabled(true)
ViewPager.SCROLL_STATE_IDLE -> swipeLayout.setDisabled(false)
}
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { }
override fun onPageSelected(position: Int) { }
})
现在效果很好!