Android 在ViewPager中为videoView使用setUserVisibleHint

Android 在ViewPager中为videoView使用setUserVisibleHint,android,android-fragments,video,android-viewpager,Android,Android Fragments,Video,Android Viewpager,我已经完成了视频播放器的制作,它可以从url播放视频。唯一的问题是我使用的是ViewPager,其中有不同的页面,其中一个也是。因此,如果我不使用setUserVisibleHint()会出现两个问题,它们是: 直到我切换到第三页,视频才停止播放 如果媒体控制器可见,并且如果切换到下一页,则媒体控制器在网络页面中也可见,直到它消失 现在我的代码是: public class HomeFragment extends Fragment { private VideoView mVideoVi

我已经完成了视频播放器的制作,它可以从url播放视频。唯一的问题是我使用的是ViewPager,其中有不同的页面,其中一个也是。因此,如果我不使用setUserVisibleHint()会出现两个问题,它们是:

  • 直到我切换到第三页,视频才停止播放
  • 如果媒体控制器可见,并且如果切换到下一页,则媒体控制器在网络页面中也可见,直到它消失
现在我的代码是:

public class HomeFragment extends Fragment {

private VideoView mVideoView;
private ProgressBar mProgress;
private MediaController mMediaController;

private String url = null;
private Uri uri = null;

public HomeFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.fragment_home, container, false);

    url = "xyz";

    uri = Uri.parse(url);

    mVideoView = (VideoView) view.findViewById(R.id.homeVideoView);
    mVideoView.setBackgroundColor(Color.TRANSPARENT);

    mProgress = (ProgressBar) view.findViewById(R.id.homeSpinner);
    mProgress.setVisibility(View.VISIBLE);

    mMediaController = new MediaController(getContext());
    getActivity().getWindow().setFormat(PixelFormat.TRANSLUCENT);

    loadVideos();

    return view;
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser){
        //loading cart elements
    }else{
        Log.e("NOT", "VISIBLE");
    }
}

//load the videos in the home fragment
private void loadVideos() {

    try {

        mVideoView.setMediaController(mMediaController);
        mVideoView.setVideoURI(uri);
        mVideoView.requestFocus();

        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            public void onPrepared(final MediaPlayer mp) {
                mp.start();

                //handling the progressBar for buffering and ending it
                mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                    @Override
                    public boolean onInfo(MediaPlayer mediaPlayer, int i, int i1) {
                        if(MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START == i){
                            mProgress.setVisibility(View.GONE);
                            mp.start();
                        }
                        if (MediaPlayer.MEDIA_INFO_BUFFERING_START == i){
                            mProgress.setVisibility(View.VISIBLE);
                        }
                        if(MediaPlayer.MEDIA_INFO_BUFFERING_END == i){
                            mProgress.setVisibility(View.GONE);
                        }
                        return false;
                    }
                });
            }
        });

    } catch (Exception e) {
        Log.e("VIDEO PLAYER ERROR", e.getMessage());
    }
}
}
我试过的是:

  • 在isVisibleToUser案例中声明loadVideo(),但出现以下问题:

    视频播放器异常:无法将MedialController设置为空对象引用,并无限加载progressBar

  • 删除了loadVideos()中的所有内容,并让setOnPReparedListener()出现在那里,但这也给了我一个例外

    java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.VideoView.setOnPreparedListener(android.media.MediaPlayer$OnPreparedListener)

应用程序崩溃时说,执行此操作后,将对空对象引用调用mVideoView.stopPlayBack()

注意:此页面是应用程序打开时加载的第一个页面,因此在setUSerVisibleHint()中页面的实际可见性之前的一段时间内,条件变为else条件。

视频url是在视频视图本身上测试的,因此它只是用来处理viewPager内容。

最后,经过大量的努力,我恢复了代码的原样,让大脑在长时间的研究后休息一下。上面的完整代码需要修改。如有任何建议,将不胜感激!谢谢

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser){
        //loading cart elements
        mVideoView.start();
    }else{
        Log.e("NOT", "VISIBLE");
        mVideoView.stopPalyBack();
    }
}