Viewpager上的VideoView,切换页面时停止视频

时间:2013-02-13 12:25:58

标签: android android-viewpager android-videoview

我有一个包含不同片段的viewpager,其中一个片段中有视频片段。如果我在播放视频时切换页面,那么即使我在不​​同的页面上也会重新播放。我尝试为ViewPager实现一个OnPageChangeListener,如下所示:

viewpager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {

                if(position!=mAdapter.getCount()-1){
                    MultimediaFragment frag = (MultimediaFragment)mAdapter.getItem(position+1);
                    frag.onPageIsChanged();
                }

                if(position != 0){
                    MultimediaFragment frag = (MultimediaFragment)mAdapter.getItem(position-1);
                    frag.onPageIsChanged();
                }


            }

使用onPageIsChanged()作为我自己的方法,它试图告诉我的videoview属性停止并隐藏控件:

public void onPageIsChanged() {
        if(mVideoView!=null){
            if(mVideoView.isPlaying()){
                mVideoView.stopPlayback();
            }
            mMedia.hide();
        }
    }

问题是mVideoView总是为空,即使它在后台播放也是如此。这个视频视图是在片段的OnCreateView方法上创建的,但是在片段被销毁之前它不应该保持设置为我的mVideoView字段吗?

3 个答案:

答案 0 :(得分:10)

我通过覆盖方法解决了这个问题:

void setUserVisibleHint(boolean isVisibleToUser)

不知道这是否正确。

答案 1 :(得分:5)

你必须在你播放视频的片段中覆盖setUserVisibleHint方法。

   public void setUserVisibleHint(boolean isVisibleToUser) 
   {       
    super.setUserVisibleHint(isVisibleToUser);                         
     if (this.isVisible())
     {               
        if (!isVisibleToUser)   // If we are becoming invisible, then...
        {  
          //pause or stop video
        }

        if (isVisibleToUser) // If we are becoming visible, then...
        {                               
            //play your video               
        }
    } 
  }

答案 2 :(得分:2)

您的mAdapter.getItem很可能每次都在创建一个新片段。这将导致视频视图始终为空。

public class MyAdapter extends FragmentStatePagerAdapter {
    SparseArray<Fragment>fragments = new SparseArray<Fragment>();
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return contents.size();
    }

    @Override
    public Fragment getItem(int position) {
        Fragment frag = fragments.get(position);
        Bundle args = new Bundle();
        if(frag != null){
            return frag;
        }
        fragments.put(position, frag);
        return frag;
    }
}