Java 滑动检测和触摸侦听器在片段内不工作

Java 滑动检测和触摸侦听器在片段内不工作,java,android,kotlin,Java,Android,Kotlin,应用程序有底部导航菜单和片段。这是需要滑动检测的片段,类似于Tinder: class HomeFragment : Fragment() { private lateinit var homeViewModel: HomeViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?

应用程序有底部导航菜单和片段。这是需要滑动检测的片段,类似于Tinder:

class HomeFragment : Fragment() {
private lateinit var homeViewModel: HomeViewModel

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    homeViewModel =
            ViewModelProvider(this).get(HomeViewModel::class.java)
    val root = inflater.inflate(R.layout.fragment_home, container, false)
    val textView: TextView = root.findViewById(R.id.text_home)
    homeViewModel.text.observe(viewLifecycleOwner, {
        textView.text = it
    })
    root.setOnTouchListener(object : OnSwipeTouchListener(requireContext()) {

        override fun onSwipeRight() {
            Toast.makeText(requireContext(), "Swiped right!", Toast.LENGTH_SHORT).show()
        }

        override fun onSwipeLeft() {
            Toast.makeText(requireContext(), "Swiped left!", Toast.LENGTH_SHORT).show()
        }

    })
    return root


 }
}
该应用程序需要像Tinder这样的滑动功能。 以下是侦听器类:

open class OnSwipeTouchListener(ctx: Context) : OnTouchListener {
val gestureDetector: GestureDetector

companion object {

    private val SWIPE_THRESHOLD = 100
    private val SWIPE_VELOCITY_THRESHOLD = 100
}

init {
    gestureDetector = GestureDetector(ctx, GestureListener())
}

override fun onTouch(v: View, event: MotionEvent): Boolean {


    var isTouch = false

    if (gestureDetector != null && event != null) {

        isTouch = gestureDetector.onTouchEvent(event)
    } else {
        isTouch = true
    }

    return isTouch

}

inner class GestureListener : SimpleOnGestureListener() {

    override fun onDown(e: MotionEvent): Boolean {
        return false
    }

    override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean {
        var result = false
        try {


            val diffY = e1?.y?.let { e2?.y?.minus(it) }
            val diffX = e1?.x?.let { e2?.x?.minus(it) }

            if (diffX != null && diffY != null) {

                if (abs(diffX) > abs(diffY)) {
                    if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight()
                        } else {
                            onSwipeLeft()
                        }
                        result = true
                    }
                }
            } else {
                onSwipeRight()
                result = true
            }
        } catch (exception: Exception) {
            exception.printStackTrace()
        }

        return result
    }


}

open fun onSwipeRight() {}

open fun onSwipeLeft() {}

open fun onSwipeTop() {}

open fun onSwipeBottom() {}

open fun onSwipeDown() {

    }
}

滑动功能或任何类型的触控侦听器都无法工作。为什么会这样?我是Kotlin和移动应用开发的新手。因此,任何帮助都是非常感谢的。

在Android中,手势被定义为动作开始时向下,以动作结束时向上。如果你想让你的视图收到一个手势,你必须返回true,否则你将一无所获

根本原因

override fun onDown(e: MotionEvent): Boolean {
    return false
}
因为在此回调中,您返回false,这意味着您的视图对任何手势都不感兴趣,这解释了为什么不调用所有回调,例如
onFling()、onsweepright()、onsweeleft()

解决方案

对于“操作\停止”事件返回true

override fun onDown(e: MotionEvent): Boolean {
    return true
}
这是一篇关于Android触摸系统的好文章。有时间请看一看