我有一个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()
}
在onStop中,onPause和onDetach显示了viewPager的片段,但它不起作用。
你的帮助将是无价的!
发布于 2018-08-12 05:57:15
一个简单的界面:
interface Playable {
fun play()
fun stop()
}
包含VideoView的片段必须实现此接口
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
}
}
最后:
...
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) }
})
...
发布于 2018-08-12 06:11:16
你可以申请
if (videoView!!.isPlaying()) { videoView!!.setMediaController(null) videoView?.stopPlayback() ;
在pager.addOnPageChangeListener();
中。
https://stackoverflow.com/questions/51803178
复制相似问题