ViewPager and YouTubePlayer

≯℡__Kan透↙ 提交于 2019-12-23 01:13:59

问题


In my actvity I have a viewPager with for example 3 pages. In all of theses pages, I have a YouTubePlayer with a different id video.

The problem is that all the YouTubePlayer component has the same video at the same time.

Concretely :

When the first page is displayed, the YouTubePlayer show the first video, so all seems to be ok. When I try to scroll to the 2nd page, I can see that the 2nd YouTubePlayer show the same video. When the 2nd page is completely displayed (After scrolling), behind the view pager prepare the 3rd page. So on the 3rd page the 3rd id video is set to the YouTubePlayer component. At that moment the 2nd page currently displayed switch automatically to the 3rd video.

It was like if the instance of YouTubePlayer was single for all the pages. But on each page new FragmentYouTubePlayer() is correctly called.

I don't understand where is the problem. Finally, I wonder if it's possible to use severals YouTubePlayer component (in a viewpager) at the same time or not ?

Thanks for your help.


回答1:


I don't remember exactly what was wrong, but yes, I solved my problem. So, if it can help you, here is the code :

In my main activity, using PagerAdapter :

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager fm) {
        super(fm);
    }

    @Override
    public android.support.v4.app.Fragment getItem(int position) {
        fragmentYouTubeContent = FragmentYouTubeContent.create(position);
        return fragmentYouTubeContent;
    }

    @Override
    public int getCount() {
        int nb = 3;
        return nb;
    }
}

My FragmentYouTubeContent.class

package com.orange.OrangeJobs;


import java.util.List;

import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubeStandalonePlayer;
import com.google.android.youtube.player.YouTubeThumbnailLoader;
import com.google.android.youtube.player.YouTubeThumbnailView;


import android.support.v4.app.Fragment;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;


public class FragmentYouTubeContent extends Fragment implements YouTubeThumbnailView.OnInitializedListener {

      public static final int REQ_START_STANDALONE_PLAYER = 101;
      private static final int REQ_RESOLVE_SERVICE_MISSING = 2;
      private static final int RECOVERY_DIALOG_REQUEST = 1;

    /**
     * The fragment's page number.
     */
    private int mPageNumber;
    private String urlYouTube;
    private boolean canHideStatusBar = false;
    private Dialog errorDialog;
    FrameLayout rl;
    private YouTubeThumbnailView thumbnailView;

    /**
     * Factory method for this fragment class. Constructs a new fragment for the given page number.
     */
    public static FragmentYouTubeContent create(int pageNumber) {
        FragmentYouTubeContent fragment = new FragmentYouTubeContent();
        fragment.setPageNumber(pageNumber);
        return fragment;
    }

    public FragmentYouTubeContent() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @SuppressLint("InlinedApi")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setRetainInstance(true);
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.youtube, container, false);
        urlYouTube = "YOUR_VIDEO_URL";
        if (!"".equals(urlYouTube)) {
            thumbnailView = (YouTubeThumbnailView) rootView.findViewById(R.id.youtubethumbnailview);
            thumbnailView.initialize(Params.YOUTUBE_KEY, this);
            thumbnailView.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View arg0) {
                    // Launch standalone YoutTube player
                    Intent intent = null;
                    intent = YouTubeStandalonePlayer.createVideoIntent(getActivity(), YOUTUBE_KEY, urlYouTube, 0, true, false);
                    if (intent != null) {
                      if (canResolveIntent(intent)) {
                          canHideStatusBar = true;
                          startActivityForResult(intent, REQ_START_STANDALONE_PLAYER);
                      } else {
                          // Could not resolve the intent - must need to install or update the YouTube API service.
                          YouTubeInitializationResult
                                .SERVICE_MISSING
                                .getErrorDialog(getActivity(), REQ_RESOLVE_SERVICE_MISSING).show();
                      }
                    }
                }});
        }
        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
        boolean isLandscape = false;
        int currentOrientation = getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
            isLandscape = true;
        }
        else {
            isLandscape = false;
        }        
        if (canHideStatusBar && this.isVisible() && isLandscape) {
            Utils.hideStatusBar(getActivity());
            canHideStatusBar = false;
        }
    }

    @Override
    public void onPause() {
        super.onPause();
    }    


    @Override
    public void onInitializationSuccess(YouTubeThumbnailView thumbnailView, YouTubeThumbnailLoader thumbnailLoader) {
      thumbnailLoader.setVideo(urlYouTube);
    }

    @Override
    public void onInitializationFailure(YouTubeThumbnailView thumbnailView, YouTubeInitializationResult errorReason) {
        if (errorReason.isUserRecoverableError()) {
            if (errorDialog == null || !errorDialog.isShowing()) {
              errorDialog = errorReason.getErrorDialog(getActivity(), RECOVERY_DIALOG_REQUEST);
              errorDialog.show();
            }
          } else {
            String errorMessage = String.format(getString(R.string.error_thumbnail_view), errorReason.toString());
            Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show();
          }
    }

    // ***** Private methods *************************************************************************************

    private boolean canResolveIntent(Intent intent) {
        List<ResolveInfo> resolveInfo = getActivity().getPackageManager().queryIntentActivities(intent, 0);
        return resolveInfo != null && !resolveInfo.isEmpty();
    }

    // ***** Properties methods *************************************************************************************
    /**
     * Returns the page number represented by this fragment object.
     */
    public int getPageNumber() {
        return mPageNumber;
    }

    /**
     * @param pageNumber the pageNumber to set
     */
    public void setPageNumber(int pageNumber) {
        this.mPageNumber = pageNumber;
    }

    /**
     * @return the canHideStatusBar
     */
    public boolean isCanHideStatusBar() {
        return canHideStatusBar;
    }

    /**
     * @param canHideStatusBar the canHideStatusBar to set
     */
    public void setCanHideStatusBar(boolean canHideStatusBar) {
        this.canHideStatusBar = canHideStatusBar;
    }

}

My layout : youtube.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:clipToPadding="false"
              android:background="@color/black"
              android:scrollbarStyle="outsideOverlay"
              android:orientation="horizontal" >


    <com.google.android.youtube.player.YouTubeThumbnailView
                android:id="@+id/youtubethumbnailview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />    

    <ImageView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:contentDescription="@string/empty_string"
        android:src="@drawable/ic_media_embed_play"         
    />

</RelativeLayout>


来源:https://stackoverflow.com/questions/25624454/viewpager-and-youtubeplayer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!