VideoView 在 Fragment 中,如何在滑动时停止播放视频?

VideoView inside Fragment, How do i stop video from play when i swipe away?

我有一个 viewPager,我可以在其中显示图像和视频。 但是,当用户播放视频时 并且 立即滑动到下一个片段,上一个视频继续播放!

这是我播放视频的方式

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

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

我试过插入

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

in onStoponPauseonDetach 的 viewPager 片段,但它不起作用.

您的帮助将是无价的!

一个简单的界面:

interface Playable {

    fun play()

    fun stop()
}

包含 VideoView 的片段必须实现此接口

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

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

寻呼机适配器:

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

终于:

...
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) }
        })
...

可以申请

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

pager.addOnPageChangeListener();