1

I have a viewPager where i display both images and Video. However, when a user plays a video and immediately swipes to the next fragment, the previous Video continues to PLAY!

Here's how i played the video

videoView!!.setVideoURI(uri)
videoView!!.setMediaController(MediaController(context))
videoView!!.requestFocus()

play.setOnClickListener(View.OnClickListener {
    if (!videoView!!.isPlaying()) {
    videoView!!.start()
    videoView!!.setVisibility(View.VISIBLE)
}

I have tried inserting

if (videoView!!.isPlaying()) {
     videoView!!.setMediaController(null)
     videoView?.stopPlayback()
}

in onStop, onPause and onDetach of the viewPager's fragment but it is not working.

Your help would be invaluable!

EdgeDev
  • 2,376
  • 2
  • 20
  • 37

2 Answers2

1

A Simple Interface:

interface Playable {

    fun play()

    fun stop()
}

fragments containing VideoView must implement this interface

class VideoFragment : Fragment(), Playable {
...
    override fun play() {
        //play logic
    }

    override fun stop() {
        //stop logic
    }
...
}

PagerAdapter:

class PagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm){

    private val instantiatedItems = SparseArrayCompat<WeakReference<Any>>()
    private var selectedPosition: Int by Delegates.observable(-1) { _, oldPosition, newPosition ->
        fun playableAt(position: Int) = instantiatedItems.get(position)?.get() as? Playable
        playableAt(oldPosition)?.stop()
        playableAt(newPosition)?.play()
    }
...
    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        return super.instantiateItem(container, position).also {
            instantiatedItems.put(position, WeakReference(it))
        }
    }

    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
        instantiatedItems.remove(position)
        super.destroyItem(container, position, `object`)
    }

    fun onPageSelected(position: Int) {
        selectedPosition = position
    }
}

finally:

...
pager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
            override fun onPageSelected(position: Int) {
                adapter.onPageSelected(position)//this method is declared in PagerAdapter
            }
        }.also {
            pager.post { it.onPageSelected(pager.currentItem) }
        })
...
Akaki Kapanadze
  • 2,552
  • 2
  • 11
  • 21
0

You can apply

if (videoView!!.isPlaying()) { videoView!!.setMediaController(null) videoView?.stopPlayback() ; 

In the pager.addOnPageChangeListener();.

Kim
  • 4,080
  • 2
  • 30
  • 51
Manu Garg
  • 186
  • 2
  • 13