'Detect Gestures in Fragments inside ViewPager2

I am new to kotlin. I am trying to detect a swipe up and swipe down gestures in a fragments inside viewpager2. I try to test it by creating a toast when I touch the screen (onDown). The toast doesn't appear. Is there is something I did wrong?

Many thanks.

KC

class MainActivity : AppCompatActivity(){


    private var binding:ActivityMainBinding?= null
    private var viewPager2:ViewPager2?= null
    private lateinit var mDetector: GestureDetectorCompat


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding?.root)

        setupViewPager()
        hideSystemBars()

        mDetector = GestureDetectorCompat(this, MyGestureListener())

    }

    inner class MyGestureListener : GestureDetector.SimpleOnGestureListener() {

        override fun onDown(event: MotionEvent): Boolean {
            Log.d(DEBUG_TAG, "onDown: $event")
            [email protected]()
            return true
        }

    }

    private fun onSwipeBottom() {
        Toast.makeText(this, "testing gesture", Toast.LENGTH_SHORT).show()
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        mDetector.onTouchEvent(event)
        return super.onTouchEvent(event)
    }


    private fun setupViewPager(){

        viewPager2 = binding?.viewPager

        val fragments: ArrayList<Fragment> = arrayListOf(
            Page1Fragment(),
            Page2Fragment(),
            Page3Fragment()
        )

        val adapter = ViewPagerAdapter(fragments, this)
        viewPager2?.adapter = adapter

    }
}

  
}

The following is the code from Page1Fragment:

class Page1Fragment : Fragment(){

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_page1, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    }

}


Solution 1:[1]

I just found out how I can detect the swipe up and swipe down gestures in the viewpager within the MainActivity. I refer to the following link and I like to share it with all of you.

KC

P.S. https://devdreamz.com/question/276438-gesture-detection-on-fragment

class MainActivity : AppCompatActivity(){

private var binding:ActivityMainBinding?= null
private var viewPager2:ViewPager2?= null
private var gestureDetector: GestureDetector? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding?.root)


    gestureDetector = GestureDetector(this, gestureListener)

}

private var gestureListener: SimpleOnGestureListener = object : SimpleOnGestureListener() {
    override fun onFling(
        downEvent: MotionEvent,
        moveEvent: MotionEvent,
        velocityX: Float,
        velocityY: Float
    ): Boolean {
        val SWIPE_MIN_DISTANCE = 100
        val SWIPE_THRESHOLD_VELOCITY = 100

        val diffY = moveEvent.y - downEvent.y


        try {
                if( abs(diffY) > SWIPE_MIN_DISTANCE &&  abs(velocityY) > SWIPE_THRESHOLD_VELOCITY){
                    if(diffY  > 0){
                        onSwipeBottom()
                    } else{
                        onSwipeTop()
                    }

                    return true
                }

        } catch (e: Exception) {
            // nothing
        }
        return false
    }

    override fun onDown(event: MotionEvent): Boolean {
        return true
    }
}

private fun onSwipeTop() {
   
    Toast.makeText(this, "swipe top", Toast.LENGTH_SHORT).show()
}

private fun onSwipeBottom() {
    Toast.makeText(this, "swipe bottom", Toast.LENGTH_SHORT).show()
}


override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
    gestureDetector!!.onTouchEvent(event)
    return super.dispatchTouchEvent(event)
}

private fun setupViewPager(){

    viewPager2 = binding?.viewPager

    val fragments: ArrayList<Fragment> = arrayListOf(
        Page1Fragment(),
        Page2Fragment(),
        Page3Fragment()
    )

    val adapter = ViewPagerAdapter(fragments, this)
    viewPager2?.adapter = adapter

    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Spidey