SwipeRefreshLayout中的Android ViewPager

时间:2019-05-16 15:22:43

标签: android android-fragments android-viewpager swiperefreshlayout

我有一个ViewPager,在SwipeRefreshLayout中包含三个片段。我看到的问题是,当尝试在ViewPager中的片段之间滑动时,有时SwipeRefreshLayout将接管并停止与ViewPager的交互。如果ViewPager交互的手势即使是一点点都垂直,则似乎是这样做的。

1 个答案:

答案 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) { }
})

现在效果很好!