8

我有一个带有不同片段的浏览器,其中一个有一个视频视图。如果我在播放视频时切换页面,那么即使我在不​​同的页面上,它也会继续播放。我尝试像这样为 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 字段吗?

4

3 回答 3

10

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

void setUserVisibleHint(boolean isVisibleToUser)

不知道这是否是正确的方法。

于 2013-02-13T15:27:52.240 回答
7

您必须在播放视频的片段中覆盖 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               
        }
    } 
  }
于 2015-02-17T10:54:29.537 回答
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;
    }
}
于 2013-10-09T19:03:59.330 回答