'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 |
