在 Fragment 中使用 setOnTouchListener 与 Viewpager2 左右拖动冲突的解决办法是使用 GestureDetector 来处理触摸事件。下面是具体的代码示例:

首先,在 Fragment 中定义一个 GestureDetector 对象:

private lateinit var gestureDetector: GestureDetector

然后,在 Fragment 的 onCreateView 方法中初始化 GestureDetector 对象,并将触摸事件交给 GestureDetector 处理:

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val rootView = inflater.inflate(R.layout.fragment_my, container, false)

    // 初始化GestureDetector对象
    gestureDetector = GestureDetector(requireContext(), object : GestureDetector.SimpleOnGestureListener() {
        override fun onDown(e: MotionEvent?): Boolean {
            // 返回true表示消费了该事件
            return true
        }
    })

    // 设置触摸事件监听器
    rootView.setOnTouchListener { v, event ->
        // 将触摸事件交给GestureDetector处理
        gestureDetector.onTouchEvent(event)
    }

    return rootView
}

接下来,重写 Fragment 的 onCreate 方法,在其中设置 ViewPager2 的触摸事件监听器,通过判断是否滑动到边界来解决冲突:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // 设置ViewPager2的触摸事件监听器
    viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
            // 判断是否滑动到边界
            if (position == 0 && positionOffsetPixels == 0) {
                // 左边界,禁止向右滑动
                viewPager2.isUserInputEnabled = false
            } else if (position == viewPager2.adapter?.itemCount?.minus(1) && positionOffsetPixels == 0) {
                // 右边界,禁止向左滑动
                viewPager2.isUserInputEnabled = false
            } else {
                // 非边界,允许滑动
                viewPager2.isUserInputEnabled = true
            }
        }
    })
}

这样就可以在 Fragment 中使用 setOnTouchListener 与 Viewpager2 左右拖动冲突的情况下,通过使用 GestureDetector 来处理触摸事件,并通过判断是否滑动到边界来解决冲突。

Android Kotlin ViewPager2 Fragment 触摸冲突解决:使用 GestureDetector 处理事件

原文地址: https://www.cveoy.top/t/topic/mqVF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录