【问题标题】:viewpager is not working when using in viewpager在 viewpager 中使用时 viewpager 不工作
【发布时间】:2021-08-13 07:03:02
【问题描述】:

我现在正在制作一个购物中心应用程序。 root 使用 viewpager 来切换片段屏幕。 横幅视图分页器是通过向每个片段添加一个视图分页器来实现的。 所以横幅浏览器不接受任何事件。 当我滑动横幅 viewpager 时,根 viewpager 滑动并且屏幕移动。 我认为根 viewpager 正在阻止子 viewpager。我该如何解决这个问题? 我无法覆盖 canSroll,因为我使用 viewpager2。

enter image description here

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    在滚动视图与包含它的 ViewPager2 对象具有相同方向的情况下,ViewPager2 本身不支持嵌套滚动视图。

    用 xml 布局中的此类将子 ViewPager2 包装起来。

    试试这个:

    class NestedScrollableHost : FrameLayout {
        constructor(context: Context) : super(context)
        constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    
        private var touchSlop = 0
        private var initialX = 0f
        private var initialY = 0f
        private val parentViewPager: ViewPager2?
            get() {
                var v: View? = parent as? View
                while (v != null && v !is ViewPager2) {
                    v = v.parent as? View
                }
                return v as? ViewPager2
            }
    
        private val child: View? get() = if (childCount > 0) getChildAt(0) else null
    
        init {
            touchSlop = ViewConfiguration.get(context).scaledTouchSlop
        }
    
        private fun canChildScroll(orientation: Int, delta: Float): Boolean {
            val direction = -delta.sign.toInt()
            return when (orientation) {
                0 -> child?.canScrollHorizontally(direction) ?: false
                1 -> child?.canScrollVertically(direction) ?: false
                else -> throw IllegalArgumentException()
            }
        }
    
        override fun onInterceptTouchEvent(e: MotionEvent): Boolean {
            handleInterceptTouchEvent(e)
            return super.onInterceptTouchEvent(e)
        }
    
        private fun handleInterceptTouchEvent(e: MotionEvent) {
            val orientation = parentViewPager?.orientation ?: return
    
            // Early return if child can't scroll in same direction as parent
            if (!canChildScroll(orientation, -1f) && !canChildScroll(orientation, 1f)) {
                return
            }
    
            if (e.action == MotionEvent.ACTION_DOWN) {
                initialX = e.x
                initialY = e.y
                parent.requestDisallowInterceptTouchEvent(true)
            } else if (e.action == MotionEvent.ACTION_MOVE) {
                val dx = e.x - initialX
                val dy = e.y - initialY
                val isVpHorizontal = orientation == ORIENTATION_HORIZONTAL
    
                // assuming ViewPager2 touch-slop is 2x touch-slop of child
                val scaledDx = dx.absoluteValue * if (isVpHorizontal) .5f else 1f
                val scaledDy = dy.absoluteValue * if (isVpHorizontal) 1f else .5f
    
                if (scaledDx > touchSlop || scaledDy > touchSlop) {
                    if (isVpHorizontal == (scaledDy > scaledDx)) {
                        // Gesture is perpendicular, allow all parents to intercept
                        parent.requestDisallowInterceptTouchEvent(false)
                    } else {
                        // Gesture is parallel, query child if movement in that direction is possible
                        if (canChildScroll(orientation, if (isVpHorizontal) dx else dy)) {
                            // Child can scroll, disallow all parents to intercept
                            parent.requestDisallowInterceptTouchEvent(true)
                        } else {
                            // Child cannot scroll, allow all parents to intercept
                            parent.requestDisallowInterceptTouchEvent(false)
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多